2009-11-20 4 views
5

В документации для Autofac есть интересная страница, описывающая ее способность автоматически генерировать delegate factories. Он также настоятельно предлагает вам получить аналогичные результаты без Autofac, написав их вручную.Как реализовать фабрику делегатов?

Я использую Unity для IoC и хотел бы избежать передачи контейнера в объекты, которые должны создавать другие объекты, так как бы вы могли написать фабрику делегатов без Autofac?

ответ

6

Ну, я до сих пор не использовал Единство, поэтому мой ответ довольно расплывчатый.

Директор прост. Вы определяете некоторые делегаты, которые представляют собой фабрики. Затем вы создаете «фабричный» класс, который имеет общедоступные методы, которые соответствуют делегатам. Этот класс знает контейнер. Теперь вы зарегистрируете делегат и установите этот класс как реализацию. Затем вы можете ввести только делегата. Когда вы вызываете проиндексированного делегата, вызывается фабричный класс, который знает контейнер и запрашивает контейнер для нового экземпляра.

Сначала вы определяете своих заводских делегатов.

public delegate TServiceType Provider<TServiceType>(); 
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument); 

создать общий завод:

/// <summary> 
/// Represents a <see cref="Provider{TArg,TServiceType}"/> which holds 
/// the container context and resolves the service on the <see cref="Create"/>-call 
/// </summary> 
internal class GenericFactory{ 
    private readonly IContainer container; 

    public ClosureActivator(IContainer container) 
    { 
     this.container= container; 
    } 

    /// <summary> 
    /// Represents <see cref="Provider{TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create() 
    { 
     return container.Resolve<TService>(); 
    } 
    /// <summary> 
    /// Represents <see cref="Provider{TArg,TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create(TArg arg) 
    {   
     return container.Resolve<TService>(new[] {new TypedParameter(typeof (TArg),arg)}); 
    } 
} 

Теперь то, что вы зарегистрировать делегата, что-то вроде этого:

var newServiceCreater = new GenericFactory(container); 
container.Register<Provider<MyCompoent>>().To(newServiceCreater.Create); 

var newServiceCreater = new GenericFactory(container); 
container 
    .Register<Provider<OtherServiceWithOneArgumentToConstruct>>() 
    .To(newServiceCreater.Create); 

Теперь другой вы впрыснуть к другим компонентам только «Provider 'вместо контейнера.

+0

Это заставило меня начать - большое спасибо! – GraemeF

Смежные вопросы