与Unity共享WCF服务合同

时间:2012-03-29 04:41:59

标签: c# wcf unity-container

我对WCF很新,我希望在一个解决方案中的服务和另一个解决方案中的服务使用者之间共享服务合同和数据协定。我创建了一个单独的项目,在包含服务合同和数据合同的两个解决方案之间共享。当我引用我的服务数据合同正在共享但不是服务合同。我的合同如下:

[ServiceContract]
public interface IDistributionService
{
    [OperationContract]
    [ServiceKnownType(typeof (Distribution))]
    bool AddDistributions(Distribution[] oDistributions);
}

当我查看reference.cs文件时,我正在使用Distribution对象,但它再次生成IDistributionService合约,这里是reference.cs文件的摘录:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="eDistributorService.IDistributionService")]
public interface IDistributionService {
   [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IDistributionService/AddDistributions", ReplyAction="http://tempuri.org/IDistributionService/AddDistributionsResponse")]
    bool AddDistributions(mhcb.syd.eDistribution.WebServices.Contracts.DTO.Distribution[] oDistributions);
    }

有没有办法让使用者使用IDistributionService接口而不在reference.cs文件中生成具体实例?

我想知道的主要原因是我可以使用依赖注入(统一)。

.RegisterType<IDistributionService, DistributionServiceClient>(
                new Interceptor<InterfaceInterceptor>(),
                new InterceptionBehavior(container.Resolve<IInterceptionBehavior>()))

再次感谢!

2 个答案:

答案 0 :(得分:1)

首先检查您是否指示服务参考工具“重用类型”。当您转到“添加服务引用...”时,单击“高级”并确认已选中“在引用的程序集中重用类型”选项。

如果选中此选项(我认为这是默认行为),那么您可能无法通过添加“服务引用”来执行所需操作。

共享合同是首选的WCF模式(在我看来),但我通常采用的实现是使用ChannelFactory类来实例化客户端连接,而不是使用生成的代理。生成的代理很好 - 它快速而简单 - 但它很笨重而且需要维护。

Using ChannelFactory vs Proxies in WCF上查看此MSDN链接以进行讨论,并查看此CodeProject link以了解样本用途。

答案 1 :(得分:0)

代码artefacts svcutil产生糟糕。但它们是迄今为止使用WCF提供的解耦最简单(即最便宜)的方式。重用合同和实体是服务和消费者的tight coupling

如果您希望容器为WCF服务生成客户端代理,您可以使用extension for Unity来实现这一目的。它也支持WCF4发现功能。