2016-06-29 20 views
0

Betrachten Sie den folgenden Satz von Klassen:Ist es möglich, alle Abhängigkeiten und nur Abhängigkeiten einer bestimmten Klasse bei Castle Windsor zu registrieren?

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) { } 
} 

ich folgende Schloss Windsor Installateur alle Klassen registrieren verwende, die von IService erben:

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

Wie kann ich Wille, schreiben einen Installer registriere alle Klassen, die Abhängigkeiten von bereits registrierten Klassen sind, aber nicht mehr. Mit anderen Worten: Wie kann ich schreibe ein allgemeines Installationsprogramm, die IDep1 und IDep2, aber nicht IDep3 (weil IDep3 wird von keinen IService

+2

die Registrierung tun Warum würden Sie halten IDep3 in Ihrem Code-Basis wenn es nicht benutzt wird? – Paolo

+1

Warum ist es wichtig, ob eine Klasse registriert, aber nicht verwendet wird? – stuartd

+0

Weil Dep3 anderswo benutzt wird und ich nicht möchte, dass es im Container ist. – Eiver

Antwort

1

Sie können sie registrieren, werden versuchen, Filtern verwendet? die Typen mit dem .Where.

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

See documentation

Aber es mir glaubt, dass so „riecht“ zu tun - vielleicht eine andere Schnittstelle haben, die IDep1 und IDep2 wird von erben während IDep3 nicht, und von dieser Schnittstelle

+0

Einverstanden, aber ich glaube, das OP möchte Typen bedingt registrieren, je nachdem, ob sie tatsächlich von irgendeiner Implementierung von IService verwendet werden. –

+0

Ya dachte ich auch, aber Castle funktioniert nicht wirklich so ... also beschlossen, nur diese Option zu geben + meine Bedenken –

+0

Ich möchte definitiv IDep3 nicht manuell ausschließen. Ich möchte lieber einen Konstruktor aufrufen, alle Argumente durchgehen und diese Typen registrieren und rekursiv wiederholen. Meine Frage ist: Muss ich das manuell machen oder gibt es eine knifflige Art, Burg zu sagen, dass sie das für mich tun soll? – Eiver