1

我有一个应用程序将使用 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)等等,但这可能意味着很多调用。

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

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

4

1 回答 1

1

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

在客户端,您很可能还必须添加一个类似的合约解析器,因此只有在您知道可以从服务中获取哪些类型的情况下,这才有效。

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

于 2012-11-13T11:16:46.100 回答