自定义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

原文地址:https://www.cnblogs.com/tansm/p/DSP5.html