Wcf和接口作为参数

时间:2008-09-30 16:11:29

标签: c# .net wcf web-services

我有一个库,其中包含一些共享相同界面的实体。客户和服务共享此程序集。现在我想知道是否有办法在我的服务合同中将此接口类型作为参数,以便我可以对实现接口的所有类使用相同的方法。

实体itselve都使用datacontract-attribute及其成员使用datamember属性进行修饰。

有可能吗?可能与 NetDataContractSerializer ? 我知道我可以用基类(一些抽象类,例如)和 knowntype - 属性来做,但我肯定更喜欢接口作为对象的识别器,因为它在客户端广泛使用应用程序,将简化开发。

感谢

3 个答案:

答案 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概念),此部分也很有用。