Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Wcf和接口作为参数_C#_.net_Wcf_Web Services - Fatal编程技术网

C# Wcf和接口作为参数

C# Wcf和接口作为参数,c#,.net,wcf,web-services,C#,.net,Wcf,Web Services,我有一个库,其中一些实体共享同一个接口。客户端和服务共享此程序集。现在我想知道是否有一种方法可以将此接口类型作为我的服务契约中的参数,以便我可以对实现接口的所有类使用相同的方法 实体本身都用datacontract属性修饰,其成员用datamember属性修饰 有可能吗?可能是NetDataContractSerializer? 我知道我可以用一个基类(例如一些抽象类)和knowntype属性来实现,但我更喜欢将接口作为对象的标识器,因为它在客户端应用程序中被广泛使用,并且会简化开发 谢谢在常规

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

实体本身都用datacontract属性修饰,其成员用datamember属性修饰

有可能吗?可能是NetDataContractSerializer? 我知道我可以用一个基类(例如一些抽象类)和knowntype属性来实现,但我更喜欢将接口作为对象的标识器,因为它在客户端应用程序中被广泛使用,并且会简化开发


谢谢

在常规的“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]s(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概念),此部分也很有用。

+1对于服务客户端,可以“强制”每个代理POCO使用部分类实现共享、部署的接口。