2016-07-19 5 views
1

.dll内にいくつかのWCFサービスを持つプロジェクトがあります。プロジェクトはCastle Windsorを使用しています。 SecurityServiceBehaviorには、WCFサービスで使用するIServiceBehaviorも実装されています。 SecurityServiceBehaviorコンストラクタには、引数として渡されたISecuritySettingsProviderが必要です。CastleWindsorを使用してIServiceBehaviorの異なる設定を登録します。

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 

その後、私は.SVCファイルで、このファクトリを使用することができます:それはウィンザーなし仕組み 。

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()); 

をしかし、それは私がサービス2のためのサービス1とService2SettingsProviderためSecurityServiceBehavior Service1SettingsProviderを必要とcosを必要とするように動作しません。今、私はこの使用してウィンザーを登録していますか。 これを行う最善の方法は何ですか?

+0

各サービスに異なるパラメータ名を付けて、[この質問で説明した手法の1つを使用して](http://stackoverflow.com/questions/9339840/register-component-based-on-parameter-name- on-requestor-in-windsor) – stuartd

+0

これを行う方法を説明できませんか?たとえば、Service1のコンストラクタにパラメータを渡すことはできますが、私はそれがどのように役立つかはわかりません –

+0

パラメータ**の名前に基づいて別のサービスを定義することができるので** service1は 'ISettingsProvider service1settingsProvider'とservice2 ISettingsProvider service2settingsProvider'をパラメータとしてとります。 – stuartd

答えて

1

答えがないので、私は最後に使用した解決策を投稿します。おそらくSubResolversを介して行うこともできますが、どのサービス設定が属するべきかを理解する方法が見つかりませんでした。 DefaultServiceHostFactoryを導出し、私はそれはウィンザーもIServiceBehaviorを解決するために使用される固有のコンテナのサービス1を提供してきましたCreateKernel()メソッドを使用することにより

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; 
    } 
} 

:その代わりに、私はこのようなウィンザーのDefaultServiceHostFactoryを導出するService1Factoryを変更しました。しかし、私はアプリケーションコンテナも必要なので、ウィンザーの子コンテナを使用しました。 Service2Factoryは類似して宣言されていますが、Service2とService2SettingsProviderを使用しています。

関連する問題