3

IoC に Windsor Castle を使用する S#arp Architecture を使用しています。プロジェクト内の他のすべてのコントローラーとは異なり、同じインターフェイスの異なる実装が必要な新しいコントローラーを入手しました。つまり、すべてのコントローラーは ProductsRepository: IProductsRepository を実装として使用しますが、新しいコントローラーは SpecificProductsRepository を使用する必要があります。

これを自動的に認識して管理するように構成するにはどうすればよいですか? 純粋な Windsor の方法、または ASP.NET MVC のヘルプ (たとえば、カスタム コントローラー ファクトリ) のいずれかです。

サブコンテナが必要なようです。まだ探している。

4

2 に答える 2

6

Windsor のサービス オーバーライドを使用すると、より簡単で簡単な方法が得られます。

たとえば、次のようにリポジトリを登録します。

container.Register(Component.For<IProductsRepository>
                     .ImplementedBy<ProductsRepository>()
                     .Named("defaultProductsRepository"),
                   Component.For<IProductsRepository>
                     .ImplementedBy<SpecificProductsRepository>()
                     .Named("specificProductsRepository"));

これにより、デフォルトの実装が確実になりますProductsRepository。次に、特定のコントローラーに対して、次のようにサービス オーバーライドを追加します。

container.Register(Component.For<NewController>()
     .ServiceOverrides(ServiceOverride
          .ForKey("productsRepository")
          .Eq("specificProductsRepository"));

ここでドキュメントを読むことができます。

編集:リポジトリを に登録する場合はAllTypes、次のように登録キーを調整できます。

container.Register(AllTypes.[how you used to].Configure(c => c.Named(GetKey(c)));

たとえば、GetKey次のようなものです。

public string GetKey(ComponentRegistration registration)
{
    return registration.Implementation.Name;
}
于 2011-03-15T10:10:04.223 に答える
0

OK、最近は自分の質問に答える傾向があります...それで、それが必要な人のためにここにあります.

     // create subcontainer with specific implementation
     var mycontainer = new WindsorContainer();
     mycontainer.Register(AllTypes.Pick()
        .FromAssemblyNamed("My.Data")
        .WithService.FirstInterface()
        .Where(x => x.Namespace == "My.Data.Custom")
        .Configure(x => x.LifeStyle.Is(LifestyleType.PerWebRequest)));
     container.AddChildContainer(mycontainer);

     ControllerBuilder.Current.SetControllerFactory(new ExtendedControllerFactory(
        new Dictionary<string, IWindsorContainer> { {"", container}, {"Lm", mycontainer} }));

コントローラー ファクトリは、名前に基づいて適切なコンテナーを選択します。ここでの最大の課題は、リクエストの最後に適切なコンテナーの Release(controller) を呼び出すことです。つまり、コントローラーのインスタンス化に使用されたコンテナーを覚えておくことです。しかし、これは私が推測するいくつかの方法で解決できます-スレッド固有(HttpContext内)で記憶する、BaseControllerプロパティで記憶する、内部辞書で記憶するなど。

于 2011-03-15T09:37:49.663 に答える