J'injecte un Logger
en todos mes cours. La plupart de mes classes ont le Logger
définie, sauf en cas de chaîne d'héritage (dans ce cas, seule la classe de base possède cette propriété, et toutes les classes dérivées l'utilisent). Lorsque ces classes sont instanciées par le conteneur Windsor, elles obtiendraient mon implémentation de ILogger
injecté dans ces derniers. J'utilise actuellement l'injection de propriété, car injecter tout dans le constructeur n'est pas très agréable.
Puis-je les retirer du conteneur car ils sont de nature transitoire ? Est-ce que je dois les enregistrer dans le conteneur et les injecter dans le constructeur de la classe qui en a besoin ? Je ne veux pas non plus, pour une seule classe, créer un fichier TypedFactory
et injecter la fabrique dans la classe qui en a besoin.
Une autre idée qui m'est venue à l'esprit est la suivante new
les augmenter en fonction des besoins. Ainsi, si je les crée, je devrai instancier manuellement l'élément Logger
dans ces classes. Comment puis-je continuer à utiliser le conteneur pour TOUTES mes classes ?
Exemple d'enregistrements à Windsor :
//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());
Exemples de classes :
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
}
}
Questions :
-
Comment créer de nouveaux
Record
sans utiliser "new" ? -
QueueMonitor
esSingleton
considérant queData
est "Scoped". Comment puis-je injecterData
enOnDataReceived()
méthode ?