Виндзор - вытащить временные объекты из контейнера
Как я могу вытащить объекты из контейнера, которые являются переходными по природе? Нужно ли регистрировать их в контейнере и вставлять в конструктор нужного класса? Впрыскивать все в конструктор не очень хорошо. Также только для одного класса я не хочу создаватьTypedFactory
и ввести фабрику в нуждающийся класс.
Еще одна мысль, которая пришла ко мне, была «новая» их по мере необходимости. Но я также делаю инъекциюLogger
компонент (через свойство) во все мои классы. Поэтому, если я обновлю их, мне придется вручную создать экземпляр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
}
}
Вопросов:
Как мне создать новыйRecord
объект без использования «нового»?
QueueMonitor
являетсяSingleton
, в то время какData
является "Scoped". Как я могу ввестиData
вOnDataReceived()
метод?