当你使用svcutil.exe or the 添加服务参考在 Visual Studio 中的向导中,自动生成的多种类型之一就是客户端界面。我们就这样称呼它吧IMyService
。还会有another自动生成的界面称为类似IMyServiceChannel
实现 IMyService 和 IDisposable。在客户端应用程序的其余部分中使用此抽象。
由于您希望能够创建一个新通道并再次关闭它,因此您可以引入一个抽象工厂:
public interface IMyServiceFactory
{
IMyServiceChannel CreateChannel();
}
在客户端应用程序的其余部分中,您可以依赖 IMyServiceFactory:
public class MyClient
{
private readonly IMyServiceFactory factory;
public MyClient(IMyServiceFactory factory)
{
if (factory == null)
{
throw new ArgumentNullException("factory");
}
this.factory = factory;
}
// Use the WCF proxy
public string Foo(string bar)
{
using(var proxy = this.factory.CreateChannel())
{
return proxy.Foo(bar);
}
}
}
您可以创建包装 WCF 的 IMyServiceFactory 的具体实现ChannelFactory<T>
作为一个实现:
public MyServiceFactory : IMyServiceFactory
{
public IMServiceChannel CreateChannel()
{
return new ChannelFactory<IMyServiceChannel>().CreateChannel();
}
}
现在,您可以通过将 IMyServiceFactory 映射到 MyServiceFactory 来配置 DI 容器。温莎城堡的做法如下:
container.Register(Component
.For<IMyServiceFactory>()
.ImplementedBy<MyServiceFactory>());
奖金信息:这里是如何将 WCF 服务与 DI 容器连接起来 https://stackoverflow.com/questions/2042609/injecting-data-to-a-wcf-service/2042858#2042858.