Wcf和接口作为参数

时间:2020-03-06 14:55:54  来源:igfitidea点击:

我有一些共享相同接口的实体的图书馆。客户和服务共享此程序集。现在我想知道是否有一种方法可以在我的服务合同中将此接口类型作为参数,以便我可以对实现该接口的所有类使用相同的方法。

它们自己的实体都用datacontract-attribute装饰,而其成员则用datamember属性装饰。

有可能吗?可能与NetDataContractSerializer在一起?
我知道我可以使用基类(例如一些抽象类)和knowntype-attribute来做到这一点,但是id绝对更喜欢Interface作为对象的标识符,因为它在客户端应用程序中得到了广泛使用,并且会简化开发工作。

谢谢

解决方案

在常规的" mex"下,这当然是不可能的。程序集共享可能是可行的,但是我真的不建议我们与WCF对抗:它很脆弱,等等。当然,我们始终可以在对象模型中屏蔽它,而不是直接调用[OperationContract]方法,将其抽象为一个隐藏WCF详细信息的包装方法(也许使用与实际返回的对象不同的对象进行数据传输)。

我在OperationContracts的实现中使用ServiceKnownType属性解决了该问题。

当告诉实现该接口的类为ServiceKnownType的类时,我们可以将该接口用作参数,因此,只要它们是可序列化的,就可以使用实现该接口的所有类。 (请参阅Juval L?wy的"对WCF服务进行编程",第100页)

[我刚刚阅读了答案,并意识到我们是在专门询问服务方法的参数。我的评论会留在这里,以防它们仍然有帮助。]

在我知道导线两边都有WCF的项目上,我所做的事情是这样的:

仅共享接口的库,例如:

namespace SharedInterfaces {
    public interface ICompositeType {
        bool BoolValue { get; set; }
        string StringValue { get; set; }
    }
}

WCF服务库,其中DataContract实现共享接口。

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