Как я реализую фабрику делегата?

Академия склонна предпочитать цикл с условием продолжения, поскольку это делает для менее сложного обоснования о программах. Я склонен предпочитать для - или структуры цикла foreach, поскольку они делают для более легкого к чтению кода.

6
задан GraemeF 20 November 2009 в 12:17
поделиться

1 ответ

Что ж, я никогда не использовал Unity, поэтому мой ответ довольно расплывчатый.

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

Сначала вы определяете свои фабрики-делегаты.

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» вместо контейнера.

6
ответ дан 17 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: