我想在 WCF 中注入(inject)我的接口(interface)的实现,但我想在 WCF 的客户端中初始化我的依赖注入(inject)容器。所以我可以为我的服务的每个客户提供不同的实现。
最佳答案
当您在 Visual Studio 中使用 svcutil.exe 或添加服务引用 向导时,自动生成的众多类型之一将是客户端界面。我们称它为IMyService
.还会有另一个自动生成的界面,名称类似于IMyServiceChannel
。实现 IMyService 和 IDisposable。在您的客户端应用程序的其余部分中使用此抽象。
既然你希望能够创建一个新的 channel 并再次关闭它,你可以引入一个抽象工厂:
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 的 ChannelFactory<T>
的 IMyServiceFactory 的具体实现作为一个实现:
public MyServiceFactory : IMyServiceFactory
{
public IMServiceChannel CreateChannel()
{
return new ChannelFactory<IMyServiceChannel>().CreateChannel();
}
}
您现在可以通过将 IMyServiceFactory 映射到 MyServiceFactory 来配置您的 DI 容器。这是在 CaSTLe Windsor 中的做法:
container.Register(Component
.For<IMyServiceFactory>()
.ImplementedBy<MyServiceFactory>());
关于c# - 依赖注入(inject) wcf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3010820/