我有一个库,其中包含一些共享相同界面的实体 . 客户和服务共享此程序集 . 现在我想知道是否有办法在我的服务 Contract 中将此接口类型作为参数,以便我可以对实现接口的所有类使用相同的方法 .
实体itselve都使用datacontract-attribute及其成员使用datamember属性进行修饰 .
它有可能吗?可能与NetDataContractSerializer?我知道我可以用基类(例如一些抽象类)和知识类型属性来做,但我肯定更喜欢接口作为对象的标识符,因为它在客户端应用程序中被广泛使用并且可以简化开发 .
谢谢
3 回答
我在OperationContracts的实现中使用ServiceKnownType属性解决了问题 .
当告诉你的类实现接口为ServiceKnownType时,可以使用接口作为参数,因此只要它们是可序列化的,就可以使用实现接口的所有类 . (查看JuvalLöwy的“编程WCF服务”,第100页)
根据常规"mex"肯定是不可能的 . 它可能与汇编共享,但我真的不推荐它 - 你正在与WCF战斗:它会很脆弱等等 . 当然,你总是可以在你的对象模型中掩盖它 - 即不是调用[OperationContract]方法直接将其抽象为一个隐藏WCF细节的包装器方法(可能使用不同的对象进行数据传输而不是实际返回) .
[我刚刚读了你的答案,并意识到你是专门询问服务方法的参数 . 我会留下我的评论,以防它们仍然有用 . ]
我所知道的项目,我知道我在线的两侧都有WCF,就像这样:
仅包含共享接口的库,例如:
WCF服务库,其中[DataContract](POCO)实现共享接口 .
在服务客户端中,每个代理POCO都可以“强制”使用部分类来实现共享的,部署的接口(无论如何,如果svcutil正确地完成了它的工作,它将会运行),并且您将能够编程到接口中的其余的客户代码:
如果要添加客户端可以使用的一些其他属性或方法(例如,MVP或MVVM模式中的Presenter或ViewModel概念),则此部分也很有用 .