完整教程目录请参见:《自定义Data Service Providers — 简介》
在前面的教程中,我们已经实现了IServiceProvider和IDataServiceMetadataProvider,现在我们继续。
挂接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