Когда вы используете 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-контейнеру .