2014-09-26 5 views
1

Я хочу зарегистрировать каналы WCF-клиента в autofac, поэтому я могу разрешить их просто путем включения интерфейса контракта на обслуживание в конструкторе, например. как это:Регистрация клиентских каналов WCF с помощью autofac

public LoginFormController(ILoginService loginService) 
    { ... 

Я завод, который создает каналы для меня, с одним общим родовым способом:

public T GetChannel<T>() 

Я зарегистрировал свой завод:

Builder.RegisterType<ClientChannelManager>().As<IClientChannelManager>(); 

Я могу» t выяснить, есть ли синтаксис для регистрации моего клиентского канала. Это работает, но это не то, что я хочу:

Builder.Register(c => new ClientChannelManager(new SettingsProvider()).GetChannel<ILoginService>()).As<ILoginService>(); 

Вместо того чтобы создавать новый экземпляр ClientChannelManager и его аргументы конструктора, я хочу решить из контейнера.

Лучшее, что я придумал статический метод GetChannel в моей фабрике, которая разрешает экземпляр из контейнера в явном виде:

public static T ResolveChannel<T>(IComponentContext context) 
    { 
     IClientChannelManager manager = context.Resolve<IClientChannelManager>(); 
     return manager.GetChannel<T>(); 
    } 

и зарегистрировать договор на обслуживание с помощью вызова статического метода:

Builder.Register(c => ClientChannelManager.ResolveChannel<ILoginService>(c)).As<ILoginService>(); 

Кто-нибудь знает более элегантный синтаксис/решение для этого?

ответ