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);
}
少なくとも理想的ではありませんが、少なくとも各タイプを明示的に登録する必要があります。誰かがより良い解決策を持っていることを願っています
StructureMapと比較して、具体的なインスタンスはCastle Windsorによって明示的に登録されることなく解決できません。 'container 'を呼び出す必要があります。登録する(タイプごとまたはバッチ登録を使用して)。 – Steven