依赖注入wcf

时间:2010-06-09 23:58:23

标签: c# .net wcf .net-3.5 dependency-injection

我想在WCF中注入我的接口的实现,但我希望在WCF的客户端中初始化我的容器Dependency Injection。所以我可以为我的服务的每个客户提供不同的实现。

2 个答案:

答案 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>());

奖金信息:这是how to wire up a WCF service with a DI Container

答案 1 :(得分:1)

以下是我从您的问题中理解的内容:

您有一个与WCF无关的界面。我们称之为IInterface

您有一个使用服务的WCF客户端。我们来打电话给服务合同:IService

您希望ServiceClient类在添加服务引用时默认实现IService,以实现IInterface。

如果是这种情况,您可以使用ServiceClient类标记为部分的事实。

只需为ServiceClient创建另一个部分声明并添加所需的接口(您必须确保自动生成的代码和代码的命名空间相同)。它应该看起来像:

namespace [ServiceClient Namespace]
{
    public partial class ServiceClient : IInterface
    {
    }
}

希望它有所帮助。