zoukankan      html  css  js  c++  java
  • 自定义Data Service Providers — (5)最小化的运行时服务

    完整教程目录请参见:《自定义Data Service Providers — 简介

    在前面的教程中,我们已经实现了IServiceProviderIDataServiceMetadataProvider,现在我们继续。

    挂接IDataServiceQueryProvider实现

    现在我们打算实现IDataServiceQueryProvider接口,在之前我们先重构一下之前实现的IServiceProvider接口。

    public abstract class DSPDataService<T> :

        DataService<T>, IServiceProvider

    {

        public IDataServiceMetadataProvider _metadata;

        public IDataServiceQueryProvider _query;

     

        public DSPDataService()

        {

            _metadata = GetMetadataProvider(typeof(T));

            _query = GetQueryProvider(_metadata);

        } 

        public object GetService(Type serviceType)

        {

            if (serviceType == typeof(IDataServiceMetadataProvider))

                return _metadata;

            else if (serviceType == typeof(IDataServiceQueryProvider))

                return _query;

            else

                return null;

        }

     

        public abstract IDataServiceMetadataProvider

           GetMetadataProvider(Type dataSourceType);

     

        public abstract IDataServiceQueryProvider 

           GetQueryProvider(IDataServiceMetadataProvider metadata);

    }

    注意:你需要在你自己的实现类中实现GetQueryProvider方法。

    IDataServiceQueryProver实现可能需要IDataServiceMetadataProvider的实例,所以这里传入了这个参数。

    public class Sample : DSPDataService<object>

    {

        … 参见之前章节的代码

     

        public override IDataServiceQueryProvider

            GetQueryProvider(IDataServiceMetadataProvider metadata)

        {

            return new DSPQueryProvider<object>();

        }

    }

    实现IDataServiceQueryProvider

    如果你仅仅只是想看见服务契约和$metadata信息,那么实现CurrentDataSource属性就可以了,此接口的其他方法都是在调用查询返回ResourceSets时才会被调用。

    public class DSPQueryProvider<T> : IDataServiceQueryProvider

        T_currentDataSource;

        public object CurrentDataSource

        {

            get {

                return _currentDataSource;

            }

            set {

                _currentDataSource= value as T;

            }

        } 

        public object GetOpenPropertyValue(

            object target,

           string propertyName)

        {

            throw new NotImplementedException();

        }

        public IEnumerable<KeyValuePair<string, object>>

            GetOpenPropertyValues(object target)

        {

            throw new NotImplementedException();

        }

        public object GetPropertyValue(

            object target,

            ResourceProperty resourceProperty)

        {

            throw new NotImplementedException();

        } 

        public IQueryable GetQueryRootForResourceSet(

            ResourceSet resourceSet)

        {

            throw new NotImplementedException();

        } 

        public ResourceType GetResourceType(object target)

        {

            throw new NotImplementedException();

        } 

        public object InvokeServiceOperation(

             ServiceOperation serviceOperation,

             object[] parameters)

        {

            throw new NotImplementedException();

        } 

        public bool IsNullPropagationRequired

        {

            get { throw new NotImplementedException(); }

        }

    }

    好了,至少现在我们的自定义数据服务提供者能够跑起来了,虽然他仅能够提供元数据信息。

    让我们在浏览器中键入:http://localhost/sample.svc,现在你可以看见下面的画面:

    (译者注:在Visual Studio调试环境下,localhost后面需要有个动态端口)

    如果你键入http://localhost/sample.svc/$metadata的话,你应该看见这样的画面:

    当然,我们没有实现查询,如果你要导航到Products资源集的话,会收到一个错误(地址是:http://localhost/sample.svc/products

  • 相关阅读:
    PHP 包含文件路径问题
    PHP显示今天、今月、上月、今年的起点/终点时间戳
    PHP Web基础教程
    php如何生成随机密码的几种方法
    You don't have permission to access /~whpc on this server.
    linux 网络 PING IP可以通,ping域名ping不通
    CPU : 二级缓存容量
    简单建立个人WEB网站
    MKL程序编译与连接:Lapack篇
    ldd命令原理与使用
  • 原文地址:https://www.cnblogs.com/tansm/p/DSP5.html
Copyright © 2011-2022 走看看