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