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

Теги : Unity, .NET, IoC-контейнер