首页 文章

Wcf和接口作为参数

提问于
浏览
6

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

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

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

谢谢

3 回答

  • 0

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

    当告诉你的类实现接口为ServiceKnownType时,可以使用接口作为参数,因此只要它们是可序列化的,就可以使用实现接口的所有类 . (查看JuvalLöwy的“编程WCF服务”,第100页)

  • 1

    根据常规"mex"肯定是不可能的 . 它可能与汇编共享,但我真的不推荐它 - 你正在与WCF战斗:它会很脆弱等等 . 当然,你总是可以在你的对象模型中掩盖它 - 即不是调用[OperationContract]方法直接将其抽象为一个隐藏WCF细节的包装器方法(可能使用不同的对象进行数据传输而不是实际返回) .

  • 7

    [我刚刚读了你的答案,并意识到你是专门询问服务方法的参数 . 我会留下我的评论,以防它们仍然有用 . ]

    我所知道的项目,我知道我在线的两侧都有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概念),则此部分也很有用 .

相关问题