2016-07-19 18 views
1

Ich habe ein Projekt mit mehreren WCF-Dienste innerhalb einer DLL. Projekt verwendet Schloss Windsor. Es gibt auch ein SecurityServiceBehavior implementiert IServiceBehavior, das WCF-Dienste verwenden sollten. Der SecurityServiceBehavior-Konstruktor benötigt den als Argument übergebenen ISecuritySettingsProvider. Wie es ohne Windsor funktioniert:Registrieren Sie verschiedene Einstellungen für IServiceBehavior mit CastleWindsor

public class Service1Factory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     var host = base.CreateServiceHost(serviceType, baseAddresses); 
     ISettingsProvider settingsProvider = new Service1SettingsProvider(); 
     host.Description.Behaviors.Add(new SecurityServiceBehavior(settingsProvider)); 
     return host; 
    } 
} 
public class Service2Factory : ServiceHostFactory 
{ 
    //the same but uses Service2SettingsProvider instead of Service1SettingsProvider 

Dann kann ich diese Fabriken in SVC-Datei verwenden. Nun, wie ich Registrierung dies mit Windsor:

Container.AddFacility<WcfFacility>(); 
Container.RegisterTransient<IServiceBehavior, SecurityServiceBehavior>(); 
Container.Register(Component.For<IService1>(). 
    ImplementedBy<Service1>().LifeStyle.PerWcfSession()); 
Container.Register(Component.For<IService2>(). 
    ImplementedBy<Service2>().LifeStyle.PerWcfSession()); 
//Need somehow fix this lines: 
Container.Register(Component.For<ISecuritySettingsProvider>() 
    .ImplementedBy<Service1SettingsProvider>().LifestyleSingleton()); 
Container.Register(Component.For<ISecuritySettingsProvider>() 
    .ImplementedBy<Service2SettingsProvider>().LifestyleSingleton()); 

Aber es wird nicht so funktionieren, ich brauche cos I SecurityServiceBehavior Service1SettingsProvider für Service1 und Service2SettingsProvider für Service2 benötigen. Was ist der beste Weg, das zu tun?

+0

Geben Sie jedem Dienst einen anderen Parameternamen und registrieren Sie ihn jeweils mit [einer der in dieser Frage beschriebenen Techniken] (http://stackoverflow.com/questions/9339840/register-component-based-on-parameter- name- on-requestor-in-windsor) – stuartd

+0

Kannst du mir nicht erklären, wie das geht? Ich kann Parameter an zB Service1-Konstruktor übergeben, aber ich sehe nicht, wie es helfen könnte. –

+0

Weil Sie einen anderen Dienst ** basierend auf dem Namen des Parameters ** definieren können, so dass service1 'ISettingsProvider service1settingsProvider' und service2 nimmt 'ISettingsProvider service2settingsProvider' als Parameter an. – stuartd

Antwort

1

Da es keine Antwort gibt, werde ich die Lösung posten, die ich schließlich benutzt habe. Wahrscheinlich könnte es auch über SubResolver geschehen, aber ich habe keine Möglichkeit gefunden, zu verstehen, zu welchen Serviceeinstellungen ich gehören soll. Statt dessen habe ich Service1Factory geändert Windsors DefaultServiceHostFactory wie folgt ableiten:

public class Service1Factory : DefaultServiceHostFactory 
{ 
    public Service1Factory() 
     : base(Service1Factory.CreateKernel()) 
    { 
    } 

    private static IKernel CreateKernel() 
    { 
     var Container = AppContext.Container; // application container 
     var serviceContainer = new WindsorContainer(); 
     serviceContainer.AddFacility<WcfFacility>(); 
     serviceContainer.Register(Component.For<IService1>().ImplementedBy<Service1>().LifestyleTransient()); 
     serviceContainer.Register(Component.For<IServiceBehavior>().ImplementedBy<SecurityServiceBehavior>().LifestyleTransient()); 
     serviceContainer.Register(Component.For<ISecuritySettingsProvider>() 
      .ImplementedBy<Service1SettingsProvider>().LifestyleSingleton()); 
     Container.AddChildContainer(serviceContainer); 
     return serviceContainer.Kernel; 
    } 
} 

Durch DefaultServiceHostFactory Ableitung und Verwendung CreateKernel() Methode, die ich zur Verfügung gestellt habe Dienste1 es ist einzigartig Container, Windsor auch verwendet, um IServiceBehavior zu lösen. Aber ich brauche auch App Container, also habe ich Windsors Kindercontainer benutzt. Service2Factory wird als ähnlich deklariert, verwendet aber Service2 und Service2SettingsProvider.