与Unity共享WCF服务合同
本文关键字:服务 合同 WCF 共享 Unity | 更新日期: 2023-09-27 18:29:25
我是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>()))
再次感谢!
首先检查您是否指示服务引用工具"重用类型"。当您转到"添加服务引用…"时,单击"高级"并确认选中了"在引用的程序集中重用类型"选项。
如果选中此项(我认为这是默认行为),那么您可能无法通过添加"服务引用"来完成您想要的操作。
共享契约是首选的WCF模式(在我看来),但我通常采用的实现是使用ChannelFactory
类来实例化客户端连接,而不是使用生成的代理。生成的代理很好——它既快速又简单——但它很笨重,需要维护。
有关在WCF中使用ChannelFactory与代理的讨论,请查看此MSDN链接,有关示例用法,请查看该CodeProject链接。
svcutil产生的代码错误。但它们是迄今为止使用WCF提供的解耦的最简单(即最便宜)的方法。重用合同和实体是服务和消费者的紧密耦合。
如果你想让你的容器为WCF服务生成客户端代理,你可以使用Unity的扩展来完成任务。它还支持WCF4发现功能。