Castle IoC - Как я могу предотвратить разрешение зарегистрированных компонентов как зависимостей?

Я использую метод, описанный Бояном Резником в этом question, чтобы разрешить экземпляры классов, которые не зарегистрированы в контейнере Windsor. Проблема в том, что я не хочу, чтобы эти классы были доступны как «службы» для других разрешенных экземпляров.

Например, учитывая следующие классы:

class Order
{
    public Order(ITaxCalculator tc)
    {
        // ...
    }
}

class SomeOtherThing
{
    public SomeOtherThing(ISomeOtherService sos)
    {
        // ...
    }

    Order CurrentOrder
    {
        get;
        set;
    }
}

static class WindsorExtensions
{
    public static object Create(this IWindsorContainer container, Type type)
    {
        if (!type.IsClass)
        {
            throw new ArgumentException("not class", "type");
        }

        if (!container.Kernel.HasComponent(type))
        {
            container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient);
        }

        return container.Resolve(type);
    }

    public static T Create<T>(this IWindsorContainer container)
    {
        return (T)ResolveType(container, typeof(T));
    }
}

Я хочу сказать:

Order order = container.Create<Order>();
SomeOtherThing thing = container.Create<SomeOtherThing>();

Но я не хочу, чтобы новый экземпляр Order вводился в свойство CurrentOrder SomeOtherThing. По сути, я хочу, чтобы контейнер создавал экземпляр, чтобы зависимости могли быть внедрены, но я не хочу, чтобы классы были доступны для внедрения в другие классы.

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


person Jacob Stanley    schedule 17.08.2009    source источник


Ответы (2)


Я думаю, что этот обходной путь решит вашу проблему, поскольку использует дочернее ядро ​​для «незарегистрированного» компонента, поэтому оно не должно влиять на другие компоненты.

person Mauricio Scheffer    schedule 17.08.2009

По умолчанию windsor использует инъекцию конструктора вместо инъекции свойств. Из-за этого CurrentOrder никогда не будет внедрен в класс SomeOtherThing, если вы не добавите его в конструктор.

Глядя на свой код, вы существенно опаздываете с регистрацией компонента в контейнере. Если вы хотите убедиться, что он никогда не вводился, вы можете удалить его, как только он разрешится, например.

static class WindsorExtensions
{
public static object Create(this IWindsorContainer container, Type type)
{
    if (!type.IsClass)
    {
        throw new ArgumentException("not class", "type");
    }
    if (!container.Kernel.HasComponent(type))
    {
        container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient);
    }
    object instance = container.Resolve(type);
    container.Kernel.RemoveComponent(type.FullName);
    return instance;

}

public static T Create<T>(this IWindsorContainer container)
{
    return (T)ResolveType(container, typeof(T));
}
}
person pythonandchips    schedule 17.08.2009