В этом посте я описал как с помощью 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());