2017-10-04 5 views
2

Je suis nouveau au château de Windsor, alors pardonnez-moi si je simplement manqué une fonctionnalité évidente ici ...Château de Windsor - création de contrôle des composants transitoires

J'essaie actuellement de changer un projet de travail de pur DI au château . J'ai plusieurs composants, qui ont une dépendance de propriété de type ILogger. Mon LoggerImpl est créé par une méthode de fabrication statique comme ceci:

LoggerImpl.GetLogger("LoggerName"); 

Chaque composant qui a une dépendance ILogger actuellement (DI pur) reçoit un enregistreur nommé lors de la construction de l'arborescence d'objets, par exemple:

var component1 = new MyComponent1(dependencies...); 
component.Logger = LoggerImpl.GetLogger("Component1Logger"); 
var component2 = new MyComponent2(dependencies...); 
component.Logger = LoggerImpl.GetLogger("Component2Logger"); 

Après être passé à Castle Windsor, j'ai enregistré un singleton ILogger nommé pour chaque composant qui le référence, puis j'ai assigné ces enregistreurs à mes composants en utilisant DependsOn (...). Le code est plus ou moins comme ceci:

// register logger implementations 
container.Register(Component.For<ILogger>() 
    .ImplementedBy<RolexLogger>() 
    .Named("Component1Logger") 
    .UsingFactoryMethod(() => LoggerImpl.GetLogger("Component1Logger")); 
container.Register(Component.For<ILogger>() 
    .ImplementedBy<RolexLogger>() 
    .Named("Component2Logger") 
    .UsingFactoryMethod(() => LoggerImpl.GetLogger("Component2Logger")); 

// register component implementations 
container.Register(Component.For<IComponent1>() 
    .ImplementedBy<MyComponent1>() 
    .DependsOn(Dependency.OnComponent(typeof(ILogger), "Component1Logger"))); 
container.Register(Component.For<IComponent2>() 
    .ImplementedBy<MyComponent2>() 
    .DependsOn(Dependency.OnComponent(typeof(ILogger), "Component2Logger"))); 

Tout cela semble fonctionner, mais je me demandais s'il y a un moyen plus facile de le faire? Cela ressemble à énormément de code, qui va grandir et grandir car plus de composants ont besoin de leurs enregistreurs. Je me demandais s'il était possible d'enregistrer une implémentation d'ILogger par LoggerImpl avec Transient style de vie, puis de contrôler comment les instances de LoggerImpl sont créées chaque fois qu'une dépendance à ILogger est résolue? Je suppose que je pourrais également utiliser Dependency.OnValue (LoggerImpl.GetLogger ("LoggerName")) lors de l'enregistrement des composants, mais les instances de LoggerImpl ne seraient pas enregistrées dans le conteneur, et je ne sais pas si c'est OK ou non .

Tous les commentaires, idées et suggestions seraient grandement appréciés.

Répondre

1

Vous pouvez utiliser subresolver

public class LoggerResolver : ISubDependencyResolver 
{ 
    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return dependency.TargetType == typeof(ILogger); 
    } 

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return LoggerImpl.GetLogger(model.Implementation.FullName); 
    } 
} 

que l'ajouter dans le noyau avant tout de vos inscriptions

container.Kernel.Resolver.AddSubResolver(new LoggerResolver()) 
+0

qui est exactement ce que je avais besoin, merci :) Donc, il était en fait une fonctionnalité que je Je ne savais pas. Par ailleurs, juste pour que le code fonctionne - pourriez-vous supprimer le "nouveau" mot-clé dans la méthode Resolve? –

+0

ahh ok une erreur. Merci –