Windsor - puxando objetos transitórios do contêiner
Como posso puxar objetos do contêiner de natureza transitória? Preciso registrá-los no contêiner e injetar no construtor da classe que precisa? Injetar tudo no construtor não é bom. Também apenas para uma classe, não quero criar umTypedFactory
e injete a fábrica na classe que precis
Outro pensamento que me ocorreu foi "novo", conforme necessário. Mas também estou injetando umLogger
component (através da propriedade) em todas as minhas classes. Portanto, se eu atualizá-las, terei que instanciar manualmente oLogger
nessas classes. Como posso continuar usando o contêiner para TODAS as minhas aulas?
njeção @Logger: A maioria das minhas aulas tem oLogger
propriedade definida, exceto onde houver cadeia de herança (nesse caso, apenas a classe base possui essa propriedade e todas as classes derivadas a utilizam). Quando estes são instanciados através do contêiner Windsor, eles obtêm minha implementação deILogger
injetado neles.
//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
}
}
Questões
Como crio novoRecord
objeto sem usar "novo"?
QueueMonitor
éSingleton
, enquanto queData
é "escopo". Como posso injetarData
para dentroOnDataReceived()
método?