2014-01-14 19 views
11

私はCastle Winsor Noobです。私は熱い混乱であるWebFormプロジェクトを持っています。私はユーザー登録をテストする依存関係を解決しようとしています。現在のWindsorContainerにどうやって行くのですか?この問題を解決するための多くの方法がありますCastle Windsorコンテナはどのように入手できますか?

public class WindsorConfigTask : ICastleBootstrapperTask 
{ 

    public void Execute() 
    { 
     Container.AddFacility<WcfFacility>(); 
     Container.Register(
      Component.For<IProcessMessageRequest>() 
       .ActAs(
        new DefaultClientModel 
        { 
         Endpoint = 
          WcfEndpoint.ForContract<IProcessMessageRequest>().FromConfiguration("surveyClient2") 
        } 
       ), 
      Component.For<ILocalMembershipService>() 
       .ActAs(
        new DefaultClientModel 
        { 
         Endpoint = 
          WcfEndpoint.ForContract<ILocalMembershipService>().FromConfiguration(
           "localMembershipClient") 
        }) 


      ); 

     Container.Register(Component.For<IRegistrationLogic>() 
      .ImplementedBy<RegistrationLogic>() 
      .LifeStyle.Is(LifeStyleType)); 
    } 

    public IWindsorContainer Container { get; set; } 


    #region ICastleBootstrapperTask Members 


    public Castle.Core.LifestyleType LifeStyleType 
    { 
     get; 
     set; 
    } 

    #endregion 
} 

答えて

6

が、私は、最も一般的な参照を保持するシングルトンヘルパークラスを作成することであると思う:

IWindsorContainer container = ???; 
IRegistrationLogic registrationLogic = container.Resolve<IRegistrationLogic>(); 
_registrationLogic.Register(); 

は、ここに私のブートストラップです。 DIを使用してコンテナからすべてを自動的に取得するアプリを使用することを忘れないでください。おそらく、アプリからのいくつかのコールだけがコンテナに送られるでしょう。ウィンザーのコントローラ工場を見てください。

このような何かを...

public static class ContainerManager 
{ 
    public static IWindsorContainer Container = null; 
} 

今も実現私はさらに一歩それを取ることが知られていると、あなたが得る...

public static class ContainerManager 
    { 
     private static IWindsorContainer _container = null; 
     public static IWindsorContainer Container 
     { 
      get { 
       if (_container == null) { 
         // run installers, set _container = new container 
       } 
       return _container; 
      } 

     } 
    } 

といくつかのユーティリティが含まれる可能性があなたは下流の依存オブジェクトからコンテナを取得する方法を尋ねているかもしれません...コンテナをその自己に登録することができます。デフォルトではIKernelが登録されますが、後でIWindsorContainerを登録して注入することができます。私はコンテナを直接使用することを強くお勧めします。あなたが上のコードでは...あなたが完了したときにリリースを行いますか?

16

この目的のためにウィンザーにはインタフェースがあります。それはIContainerAccessorと呼ばれます。

public class WebApplication : HttpApplication, IContainerAccessor { 
    static IWindsorContainer container; 

    public IWindsorContainer Container { 
    get { return container; } 
    } 

    protected void Application_Start() { 
    var bootstrapper = new WindsorConfigTask(); 
    bootstrapper.Execute(); 
    container = bootstrapper.Container; 
    } 

    protected void Application_End() { 
    container.Dispose(); 
    } 
} 

あなたのWebフォームでの使用には、以下の通りである:

var containerAccessor = Context.ApplicationInstance as IContainerAccessor; 
var container = containerAccessor.Container; 
+0

私が提案し、同じことを行いますが、あなたが作成する必要があることは明白ではない、それを実装するのに最適な場所はGlobal.asaxファイルですコンテナの静止。静的は本当にキーであり、インターフェースが提案するプロパティではありません。 – CrazyDart

+0

私は、ここではコンテナが作成され、いつクリーンアップされるかは明確に定義されていません。あなたのソリューションはいくつかの問題を引き起こす可能性があります。 –

+0

これは素晴らしい..だから、どのように私はWebAPIでこのコンテキストにアクセスするのですか? – ppumkin

関連する問題