2016-06-29 1 views
0

Tenir compte de l'ensemble des classes suivantes:Est-il possible d'enregistrer toutes les dépendances et seulement les dépendances d'une classe donnée avec l'installateur Castle Windsor?

public interface IService { } 
public interface IDep1 { } 
public interface IDep2 { } 
public interface IDep3 { } 

public class Dep1 : IDep1 { } 
public class Dep2 : IDep2 { } 
public class Dep3 : IDep3 { } // this one is not used 

public class Service1 : IService 
{ 
    public Service1(IDep1 dep1) { } 
} 
public class Service2 : IService 
{ 
    public Service2(IDep1 dep1, IDep2 dep2) { } 
} 

J'utilise le programme d'installation du château de Windsor suivant pour vous inscrire toutes les classes qui héritent de IService:

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IService)) 
    .WithServiceSelf() 
    .WithServiceBase() 
    .LifestyleTransient()); 

Comment puis-je écrire un programme d'installation qui sera enregistrer toutes les classes, qui sont des dépendances de classes déjà enregistrées, mais rien de plus. En d'autres termes: Comment puis-je écrire un programme d'installation générique, qui enregistrera IDep1 et IDep2, mais pas IDep3 (parce que IDep3 est utilisé par aucun IService

+2

Pourquoi voudriez-vous garder IDep3 dans votre base de code si ce n'est pas utilisé? – Paolo

+1

Pourquoi est-ce important si une classe est enregistrée mais pas utilisée? – stuartd

+0

Parce que Dep3 est utilisé ailleurs et je ne veux pas qu'il soit dans le conteneur. – Eiver

Répondre

1

Vous pouvez filtrer? les types avec le .Where.

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IService)) 
    .WithServiceSelf() 
    .WithServiceBase() 
    .Where(type => !(type is IDep3)) 
    .LifestyleTransient()); 

See documentation

Mais il me semble que faire « odeurs » - Peut-être ont une autre interface qui IDep1 et IDep2 va hériter de IDep3 alors que ne sera pas, et faire l'enregistrement par cette interface

+0

D'accord, cependant, je crois que l'OP souhaite conditionnellement enregistrer les types selon qu'ils sont effectivement utilisés par une implémentation de IService. –

+0

Ya je pensais aussi, mais Castle ne fonctionne pas vraiment de cette façon ... donc décidé de donner cette option + mes préoccupations –

+0

Je ne veux définitivement pas exclure IDep3 manuellement. Je préfère visiter un constructeur, parcourir tous les arguments et enregistrer ces types et répéter de manière récursive. Ma question est la suivante: est-ce que je dois le faire manuellement ou y a-t-il une façon délicate de dire à Castle de le faire pour moi? – Eiver