Академия склонна предпочитать цикл с условием продолжения, поскольку это делает для менее сложного обоснования о программах. Я склонен предпочитать для - или структуры цикла foreach, поскольку они делают для более легкого к чтению кода.
Что ж, я никогда не использовал 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» вместо контейнера.