Инъекция зависимости wcf - PullRequest
6 голосов
/ 10 июня 2010

Я хочу внедрить реализацию моего интерфейса в WCF, но я хочу инициализировать мой контейнер внедрения зависимостей в клиенте WCF.Так что у меня может быть своя реализация для каждого клиента моего сервиса.

Ответы [ 2 ]

17 голосов
/ 10 июня 2010

Когда вы используете svcutil.exe или мастер Добавить ссылку на службу в Visual Studio, одним из многих автоматически создаваемых типов будет интерфейс клиента.Давайте назовем это IMyService.Также будет другой автоматически сгенерированный интерфейс, называемый чем-то вроде IMyServiceChannel, который реализует IMyService и IDisposable.Используйте эту абстракцию в остальной части вашего клиентского приложения.

Поскольку вы хотите иметь возможность создавать новый канал и закрывать его снова, вы можете ввести абстрактную фабрику:

public interface IMyServiceFactory
{
    IMyServiceChannel CreateChannel();
}

InВ остальной части клиентского приложения вы можете получить зависимость от 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);
        }
    }
}

Вы можете создать конкретную реализацию IMyServiceFactory, которая обернет ChannelFactory<T> WCF в качестве реализации:

public MyServiceFactory : IMyServiceFactory
{
    public IMServiceChannel CreateChannel()
    {
        return new ChannelFactory<IMyServiceChannel>().CreateChannel();
    }
}

Теперь вы можете настроить свой DI-контейнер, сопоставив IMyServiceFactory с MyServiceFactory.Вот как это делается в Castle Windsor:

container.Register(Component
    .For<IMyServiceFactory>()
    .ImplementedBy<MyServiceFactory>());

Информация о бонусе: Вот как подключить службу WCF к DI-контейнеру .

1 голос
/ 15 апреля 2012

Вот что я понимаю из вашего вопроса:

У вас есть интерфейс, который не связан с WCF. Давайте назовем это IInterface

У вас есть клиент WCF, который использовал службу. Назовем сервисный договор: IService

вам нужен класс ServiceClient, который по умолчанию реализует IService, когда вы добавляете ссылку на службу также для реализации IInterface.

Если это так, вы можете использовать тот факт, что класс ServiceClient помечен как частичный.

Просто сделайте еще одно частичное объявление для ServiceClient и добавьте необходимый интерфейс (вы должны убедиться, что пространства имен одинаковы для автоматически сгенерированного кода и вашего кода). Это должно выглядеть примерно так:

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

Надеюсь, это помогло.

...