Wcf和接口作为参数

7
我有一个包含一些共享相同接口的实体的库。客户端和服务端都使用这个程序集。现在我想知道是否有办法将此接口类型作为我的服务契约中的参数,以便我可以对实现该接口的所有类使用相同的方法。
这些实体本身都带有DataContract属性,其成员带有DataMember属性。
这种做法是否可行?可能需要使用NetDataContractSerializer吗? 我知道可以使用基类(例如一些抽象类)和knownType属性来完成,但是我肯定更喜欢使用接口作为对象的标识符,因为它在客户端应用程序中被广泛使用,可以简化开发。
谢谢
3个回答

7

我使用ServiceKnownType属性解决了这个问题,它需要在OperationContract的实现中使用。

当您将实现接口的类告知为ServiceKnownType时,您可以将接口用作参数,因此可以使用所有实现接口的类,只要它们是可序列化的。(请参阅Juval Löwy的“Programming WCF Services”第100页)


1

在常规的“mex”下,这肯定是不可能的。使用汇编共享可能是可能的,但我真的不建议这样做 - 你正在与WCF作斗争:它会很脆弱等等。当然,你可以在你的对象模型中掩盖这一点 - 也就是说,不直接调用[OperationContract]方法,而是将其抽象成一个包装器方法,隐藏WCF细节(也许使用不同的对象进行数据传输,而实际返回的对象不同)。


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概念),则此部分也非常有用。


在服务客户端中,每个代理 POCO 都可以使用局部类“强制”实现共享的已部署接口。 - Simon_Weaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接