Я хочу, вводят реализацию моего Интерфейса в WCF, но я хочу, инициализируют мой контейнер Внедрения зависимости в Клиенте WCF. Таким образом, у меня может быть другая реализация для каждого клиента моего сервиса.
Когда вы используете svcutil.exe или мастер Добавить ссылку на службу в Visual Studio, одним из многих автоматически сгенерированных типов будет клиентский интерфейс. Назовем его 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);
}
}
}
Вы можете создать конкретную реализацию IMyServiceFactory, которая обертывает WCF ChannelFactory
в качестве реализации:
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 .