1

Ich benutze Castle Windsor und hier ist, was ich tun möchte.Castle Windsor ChildContainer Abhängigkeit Auflösung

ParentContainer hat CarFactory je nach abstrakten WheelFactory aber WheelFactory würde in der Kinder Behälter 1 und 2

ChildContainer 1 hat registriert werden WheelFactory als BigWheelFactory ChildContainer 2 hat WheelFactory als SmallWheelFactory

Jetzt haben wir [ParentContainer (ChildContainer 1, ChildContainer 2)]

Gewinde 1 uns es nur ChildContainer 1

Thread 2 verwendet nur ChildContainer 2

Thread 1 für CarFactory fragen von ChildContainer 1 sollten Autofabrik BigWheelFactory in diesem Fall verwendet werden.

Thread 2 fragen Sie nach CarFactory von ChildContainer 2, sollten Autofabrik SmallWheelFactory in diesem Fall verwendet werden.

Wie kann ich dies mit Castle Windsor erreichen. Auch wenn bedeutet nicht untergeordneten Container mit

+0

Wenn durch „Prozess“, Sie beziehen sich auf [ausführbare Prozesse] (https://msdn.microsoft.com /en-us/library/windows/desktop/ms684841(v=vs.85).aspx), sollte jeder seine eigene DI-Konfiguration haben, die vollständig von den anderen Prozessen getrennt ist. Während es möglich ist, Objekte zu serialisieren, um sie von einem Prozess zu einem anderen zu senden, ist dies eine Laufzeit-Design-Funktion einer Anwendung, nicht etwas, das sich auf DI bezieht, das nur zum Komponieren von Anwendungen dient. Wenn Sie das nicht mit Prozess meinen, schlage ich vor, dass Sie Ihre Frage ändern, um Ihre tatsächliche Bedeutung zu klären. – NightOwl888

+0

@ NightOwl888 Vorschlag bestätigt. Danke – Gurpreet

Antwort

1

Statt geordneten Container versuchen Standard-Service-Überschreibung:

var container = new WindsorContainer(); 

container.Register(Component.For<HostForThread1>().DependsOn(Property.ForKey<CarFactory>().Is("CarFactory1"))); 
container.Register(Component.For<HostForThread2>().DependsOn(Property.ForKey<CarFactory>().Is("CarFactory2"))); 

container.Register(Component.For<CarFactory>().DependsOn(Property.ForKey<WheelFactory>().Is<BigWheelFactory>()).Named("CarFactory1")); 
container.Register(Component.For<CarFactory>().DependsOn(Property.ForKey<WheelFactory>().Is<SmallWheelFactory>()).Named("CarFactory2")); 

container.Register(Component.For<WheelFactory>().ImplementedBy<BigWheelFactory>()); 
container.Register(Component.For<WheelFactory>().ImplementedBy<SmallWheelFactory>()); 


public class HostForThread1 
{ 
    public HostForThread1(CarFactory factory) 
    { 
     this.Factory = factory; 
    } 

    public CarFactory Factory { get; } 
} 

public class HostForThread2 
{ 
    public HostForThread2(CarFactory factory) 
    { 
     this.Factory = factory; 
    } 

    public CarFactory Factory { get; } 
} 

public class CarFactory 
{ 
    public CarFactory(WheelFactory wheelFactory) 
    { 
     this.WheelFactory = wheelFactory; 
    } 

    public WheelFactory WheelFactory { get; } 
} 

public abstract class WheelFactory 
{ 
} 

public class BigWheelFactory : WheelFactory 
{ 
} 

public class SmallWheelFactory : WheelFactory 
{ 
} 
+0

Danke Jan, ich erwähnte Thread 1 und 2 zur Vereinfachung, aber das könnte N Anzahl der Threads sein und ich denke, das wird nicht skalieren. Mein exakter Anwendungsfall ist für Service-Fabric-Actors, bei denen ich alle gängigen Registrierungen und einige pro Akteur haben möchte. Das liegt daran, dass ich im Service Fabric keinen Weg finden konnte, einen Verweis auf den aktuellen ausführenden Akteur zu erhalten (genau wie HttpContext.Current). Im Grunde brauche ich einige Abhängigkeiten pro Akteur Bereich und ich kann es nur tun, wenn ich einen Container pro Akteur mit einem übergeordneten Container für gemeinsame Sachen hatte. – Gurpreet

+0

@Gurpreet Vielleicht wäre das für Sie interessant: https://github.com/keithbo/Castle.Facilities.ServiceFabricIntegration. Es wird jedoch empfohlen, untergeordnete Container nicht mit Castle zu verwenden, und dieses bestimmte Beispiel funktioniert nicht wie erwartet mit ihnen. Sie müssen also eine andere Lösung finden, entweder Service-Override oder Implementierung eines eigenen HandlersSelector oder vielleicht noch etwas anderes. –

Verwandte Themen