2015-10-13 1 views
5

J'ai conçu un enregistreur de télémétrie pour quelques plates-formes distinctes en utilisant le motif compositeC#, le château de Windsor et le modèle de conception composite

public interface ILogger 
{ 
    void Log(); 
} 

public class A : ILogger 
{ 
    public void Log(...); 
} 

public class B : ILogger 
{ 
    public void Log(...); 
} 

public class Many : ILogger 
{ 
    private readonly List<ILogger> m_loggers; 

    public Many(IEnumerable<ILogger> loggers) 
    { 
     m_loggers = loggers.ToList(); 
    } 

    public void Log() 
    { 
     m_loggers.ForEach(c => c.Log()); 
    } 
} 

Maintenant, je veux être en mesure d'obtenir une instance de « beaucoup » du contenant Windsor mais ont rencontré quelques problèmes:

  • si tous ILoggers sont dans le conteneur comment puis-je assurer que je reçois le « Beaucoup » la mise en œuvre et non « A » ou « B »?

  • J'ai essayé suivre cet exemple Castle Windsor: How do I inject all implementations of interface into a ctor? et utiliser container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); pour enregistrer une classe avec IEnumerable mais si dépendance que la classe implémente également IComponent habitude il créer une dépendance circulaire?

Est ce que j'essaye même possible?

Répondre

4

Tout d'abord, il s'agit d'un modèle de conception composite et non d'un composant.

La façon dont vous le faites au château de Windsor dans votre cas devrait ressembler à ceci

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 
container.Register(Component.For<ILogger>().ImplementedBy<Many>()); 
container.Register(Component.For<ILogger>().ImplementedBy<A>()); 
container.Register(Component.For<ILogger>().ImplementedBy<B>()); 

Cela fonctionne parce que le château de Windsor ont la compréhension interne des modèles comme composite ou décorateur donc aucune dépendance circulaire sera créé dans ce cas . Juste à l'esprit que l'ordre d'enregistrement est important dans ce cas.

Plus sur l'enregistrement de différents modèles dans Castle Windsor peut être trouvé here.

0

Est-il possible avec une méthode d'usine dans l'enregistrement du conteneur?

var container = new Castle.Windsor.WindsorContainer(); 
    container.Register(Component.For<A>()); 
    container.Register(Component.For<B>()); 
    container.Register(Component.For<ILogger>() 
     .UsingFactoryMethod(k => new Many(k.Resolve<A>(), k.Resolve<B>()))); 

    var logger = container.Resolve<ILogger>(); 

Après avoir changé:

public Many(params ILogger [] loggers) 
    { 
     m_loggers = loggers.ToList(); 
    } 

Connaissance limitée du Windsor Container me conduisent à cela, il y a probablement une amélioration de ce dans le même sens de l'utilisation d'une usine pour initialiser votre objet. L'important est que la configuration se trouve dans le conteneur (même si elle est un peu verbeuse)