70 votes

Comment concevoir efficacement une application dont la plupart des classes dépendent de ILogger ?

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 :

  1. Comment créer de nouveaux Record sans utiliser "new" ?

  2. QueueMonitor es Singleton considérant que Data est "Scoped". Comment puis-je injecter Data en OnDataReceived() méthode ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X