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