WCF合约操作,其参数类型仅在运行时已知

时间:2012-11-10 12:12:16

标签: .net wcf design-patterns soa

我有一个应用程序,它将使用WCF作为应用程序协议的底层传输机制,但这个问题更多地是关于面向服务的设计而不是特定于WCF。

我在服务器上运行了不同的数据源插件,客户端可以在服务上调用GetData并指定数据源名称。这样的函数调用将返回一个数据列表,例如过期发票数组:

class OverdueAccounts
{
    float Amount;
    int Days;
    string Reference;
}

或一系列开放支持案例:

class OpenTickets
{
    DateTime Date;
    Guid TicketId;
    TicketStatus Status;
}

只有加载插件才会知道将返回的类型以及可用的数据访问方法。

public interface IDataSourcePlugin /* plugin running on server */
{
  string Name;
  Type DataType;
  object GetDataType(); // returns a type of the type specified above by DataType
}

public interface IAppService /* service contract */
{ 
  [OperationContract]
  object GetData(string datasourceName); // will call plugins IDataSourcePlugin.GetDataType
}

我的问题是这些类型只会在运行时知道,我不喜欢无类型的对象,但不知道任何其他推荐的方法来实现我的需要。

我考虑过通过返回XML字符串并指定要验证的DTD来传输数据对象,但这会在WCF可以为我做的事情之上添加一个额外的层。

或者,我可以设置一组具体的操作,例如ReadString(string fieldname)ReadInt(string fieldname)等,但这可能意味着许多电话。

将数据流和消息保持在设置协议中并且从客户端到服务器然后将服务器转到数据源是很重要的,而不是每个客户端直接转到数据源。这是出于缓存和其他业务需求的原因。

关于如何构造只能在运行时或替代设计中知道的类型的传输和结构的任何建议都会很棒。

1 个答案:

答案 0 :(得分:1)

您需要向服务添加ServiceBehavior个自定义DataContractResolver。在此自定义DataContractResolver中,您可以动态添加类型和相应的名称。

在客户端,您很可能还需要添加类似的合同解析程序,因此只有在您了解可能从服务中获得的类型时才能使用。

我在两个解析器中都使用了一个简单的词典。