В этом посте я описал как с помощью LifetimeManager можно научить Unity использовать фабрику для создания объектов.
На самом деле так делать не стоит. В составе Unity есть сборка Microsoft.Practices.Unity.StaticFactory.dll в которой находится расширение контейнера для использования фабрики объектов.
Регистрация фабрики происходит методом RegisterFactory, который принимает делегат FactoryDelegate. Этот делегат принимает параметром IUnityContainer, и возвращает object.
Пример
var r = new Random();
var container = new UnityContainer();
container
.AddNewExtension<StaticFactoryExtension>()
.Configure<StaticFactoryExtension>()
.RegisterFactory<int>("random", c => r.Next());
Чтобы этим всем было удобнее пользоваться можно написать extension-методы
public static class UnityStaticFactoryExtensions
{
private static IStaticFactoryConfiguration GetExtension(IUnityContainer container)
{
var ext = container.Configure<StaticFactoryExtension>();
if (ext == null)
{
container.AddNewExtension<StaticFactoryExtension>();
ext = container.Configure<StaticFactoryExtension>();
}
return ext;
}
public static IUnityContainer RegisterFactory<T>(
this IUnityContainer container,
Func<IUnityContainer, T> factoryMethod)
{
GetExtension(container).RegisterFactory<T>(c => factoryMethod(c));
return container;
}
public static IUnityContainer RegisterFactory<T>(
this IUnityContainer container,
string name,
Func<IUnityContainer, T> factoryMethod)
{
GetExtension(container).RegisterFactory<T>(name, c => factoryMethod(c));
return container;
}
}
Тогда код примера, показанного выше можно записать гораздо короче
var r = new Random();
var container = new UnityContainer();
container.RegisterFactory("random", c => r.Next());
