Windsor — извлечение временных объектов из контейнера

Как я могу вытащить из контейнера объекты, которые по своей природе являются переходными? Должен ли я регистрировать их в контейнере и внедрять в конструктор нужного класса? Внедрение всего в конструктор не очень приятно. Также только для одного класса я не хочу создавать TypedFactoryи внедрять фабрику в нужный класс.

Еще одна мысль, которая пришла мне в голову, заключалась в том, что они «вновь» появляются по мере необходимости. Но я также внедряю компонент Logger(через свойство) во все свои классы. Поэтому, если я их обновлю, мне придется вручную создавать экземпляры Loggerв этих классах. Как я могу продолжать использовать контейнер для ВСЕХ моих занятий?

Внедрение регистратора:В большинстве моих классов определено свойство Logger, за исключением случаев, когда имеется цепочка наследования (в этом случае только базовый класс имеет это свойство, и все производные классы используют это свойство). ). Когда они создаются через контейнер Windsor, в них будет внедрена моя реализация ILogger.

//Install QueueMonitor as Singleton
Container.Register(Component.For<QueueMonitor>().LifestyleSingleton());
//Install DataProcessor as Trnsient
Container.Register(Component.For<DataProcessor>().LifestyleTransient());

Container.Register(Component.For<Data>().LifestyleScoped());

public class QueueMonitor
{
    private dataProcessor;

    public ILogger Logger { get; set; }

    public void OnDataReceived(Data data)
    {
        //pull the dataProcessor from factory    
        dataProcessor.ProcessData(data);
    }
}

public class DataProcessor
{
    public ILogger Logger { get; set; }

    public Record[] ProcessData(Data data)
    {
        //Data can have multiple Records
        //Loop through the data and create new set of Records
        //Is this the correct way to create new records?
        //How do I use container here and avoid "new" 
        Record record = new Record(/*using the data */);
        ...

        //return a list of Records    
    }
}


public class Record
{
    public ILogger Logger { get; set; }

    private _recordNumber;
    private _recordOwner;

    public string GetDescription()
    {
        Logger.LogDebug("log something");
        // return the custom description
    }
}

Вопросы:

  1. Как мне создать новый объект Recordбез использования "new"?

  2. QueueMonitor— это Singleton, тогда как Data— это «Scoped».Как я могу внедрить Dataв метод OnDataReceived()?

57
задан Steven 28 March 2012 в 08:31
поделиться