完整教程目录请参见:《自定义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后面需要有个动态端口)

自定义Data Service Providers — (5)最小化的运行时服务

 

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

自定义Data Service Providers — (5)最小化的运行时服务

 

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

 

自定义Data Service Providers — (5)最小化的运行时服务

相关文章:

  • 2021-11-19
  • 2021-05-21
  • 2022-01-01
  • 2021-05-26
  • 2021-12-15
  • 2022-12-23
  • 2022-12-23
  • 2021-04-05
猜你喜欢
  • 2022-02-20
  • 2021-06-17
  • 2021-06-12
  • 2021-10-25
  • 2021-08-23
  • 2021-09-20
  • 2021-08-12
相关资源
相似解决方案