2011-10-23 9 views
0

CastleWindsorをIOCコンテナとして使用するには、既存のWebアプリケーションを変更する必要があります。もともとはStructureMapで開発されました。これをどのようにウィンザー城で達成できますか? (Structure Mapからの移行)

私は次の問題を抱えています。

IFoo -> Foo 
IBar -> Bar 

はうまくcontainer.Resolve<IFoo>()またはcontainer.Resolve<IBar>()作品を呼び出す:

は、私はインタフェースとそれに対応する実装のカップルを登録しているとしましょう。これは、サービスが正しく登録されていることを意味します。

var test = ObjectFactory.GetInstance<BadRequestErrorHandler>(); 

これはIFoo依存性を解決します:

は、私はそのような私が呼び出すことができるのStructureMapでIFoo

public class BadRequestErrorHandler : HttpErrorHandler 
{ 
    // services 
    public BadRequestErrorHandler(IFoo foo) {...} // has dependency on IFoo 
} 

などの他のサービスとの依存関係を持つウェブAPIクラスを持っています。

これはウィンザーでは機能しません。

これはどのようにウィンザーで達成できますか?

ありがとうございます!

* EDIT * 私はそれが明示的にBadRequestErrorHandlerを登録することで動作させるためにちょうどことができました。

container.Register(Component.For<BadRequestErrorHandler>()); 

これを実現するより良い方法が望まれています。依存関係のあるクラスを登録する必要はありません。私はそれらの束...

* EDIT痛みを緩和するために2 **

を持って、私はこれらの具体的な種類に対処するための特別なメソッドを追加しました。

public T GetInstanceWithAutoRegister<T>() 
{ 
    if (container.Kernel.GetHandler(typeof(T)) == null) 
    { 
     container.Register(Component.For<T>()); 
    } 
    return container.Resolve<T>(); 
} 

public object GetInstanceWithAutoRegister(Type pluginType) 
{ 
    if (container.Kernel.GetHandler(pluginType) == null) 
    { 
     container.Register(Component.For(pluginType)); 
    } 
    return container.Resolve(pluginType); 
} 

少なくとも理想的ではありませんが、少なくとも各タイプを明示的に登録する必要があります。誰かがより良い解決策を持っていることを願っています

+0

StructureMapと比較して、具体的なインスタンスはCastle Windsorによって明示的に登録されることなく解決できません。 'container 'を呼び出す必要があります。登録する(タイプごとまたはバッチ登録を使用して)。 – Steven

答えて

1

ILazyComponentLoaderは、コンポーネントを解決できないときにウィンザーが「最後の手段」として呼び出すフックであることを登録することで実現できます。あなたのケースでは

、実装は、おそらく多少のようになります。あなたはそれin the docsについての詳細を読むことができます

container.Register(Component.For<ILazyComponentLoader>() 
     .ImplementedBy<JustLetWindsorResolveAllConcreteTypes>()); 

public class JustLetWindsorResolveAllConcreteTypes : ILazyComponentLoader 
{ 
    public IRegistration Load(string key, Type service) 
    { 
     return Component.For(service); 
    } 
} 

- そしてそれは、このようなとして登録する必要があります。

+0

@ mookid8000が書いたことに加えて、http://docs.castleproject.org/Windsor.FAQ.ashx#Why_cant_Windsor_resolve_concrete_types_without_registering_them_first_11も見てください。これは、なぜこれをやっているのが良い考えではないのかを説明しています。 –

関連する問題