我想在WCF中注入我的接口的实现,但我希望在WCF的客户端中初始化我的容器Dependency Injection。所以我可以为我的服务的每个客户提供不同的实现。
答案 0 :(得分:17)
在Visual Studio中使用 svcutil.exe 或添加服务引用向导时,自动生成的众多类型之一将是客户端界面。我们称之为IMyService
。还会有另一个自动生成的接口,称为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 ChannelFactory<T>
作为实现的IMyServiceFactory的具体实现:
public MyServiceFactory : IMyServiceFactory
{
public IMServiceChannel CreateChannel()
{
return new ChannelFactory<IMyServiceChannel>().CreateChannel();
}
}
现在可以通过将IMyServiceFactory映射到MyServiceFactory来配置DI容器。以下是温莎城堡的成就:
container.Register(Component
.For<IMyServiceFactory>()
.ImplementedBy<MyServiceFactory>());
答案 1 :(得分:1)
以下是我从您的问题中理解的内容:
您有一个与WCF无关的界面。我们称之为IInterface
您有一个使用服务的WCF客户端。我们来打电话给服务合同:IService
您希望ServiceClient类在添加服务引用时默认实现IService,以实现IInterface。
如果是这种情况,您可以使用ServiceClient类标记为部分的事实。
只需为ServiceClient创建另一个部分声明并添加所需的接口(您必须确保自动生成的代码和代码的命名空间相同)。它应该看起来像:
namespace [ServiceClient Namespace]
{
public partial class ServiceClient : IInterface
{
}
}
希望它有所帮助。