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

  • 相关阅读:
    支付宝移动支付开发详细教程服务端采用.net mvc webapi(C#)
    微信移动支付V3开发详细教程服务端采用.net mvc webapi(C#)
    CSS border-radius 圆角
    CSS hack大全&详解(什么是CSS hack)
    一小时搞定DIV+CSS布局-固定页面开度布局
    ASP.NET MVC3开发
    .net mvc页面UI之Jquery博客日历控件
    ASP.NET MVC3开发-数据库篇之CodeFisrt开发(一)
    ASP.NET MVC页面UI之联动下拉选择控件(省、市、县联动选择)
    Jquery文本框值改变事件(支持火狐、ie)
  • 原文地址:https://www.cnblogs.com/tansm/p/DSP5.html
Copyright © 2011-2022 走看看