10

Castle WindsorIoC コンテナーとして使用しています。次のような構造のアプリケーションがあります。

  • MyApp.Services.dll
    • IEmployeeService
    • IContractHoursService
    • ...
  • MyApp.ServicesImpl.dll
    • EmployeeService : MyApp.Services.IEmployeeService
    • ContractHoursService : MyApp.Services.IContractHoursService
    • ...

現時点ではXML 構成を使用しており、新しい IService/Service ペアを追加するたびに、XML 構成ファイルに新しいコンポーネントを追加する必要があります。このすべてを流暢な登録 APIに切り替えたいのですが、私がやりたいことを行うための正確なレシピをまだ見つけていません。

誰でも助けることができますか?ライフスタイルはすべてになりますsingleton

よろしくお願いします。

4

2 に答える 2

12

これAllTypesを簡単に行うことができます:

http://stw.castleproject.org/(S(nppam045y0sdncmbazr1ob55))/Windsor.Registering-components-by-conventions.ashxから:

コンポーネントを 1 つずつ登録することは、非常に反復的な作業になる可能性があります。また、追加する新しいタイプごとに登録することを覚えていると、すぐにフラストレーションがたまる可能性があります。幸いなことに、少なくとも常に行う必要はありません。AllTypes エントリ クラスを使用すると、指定した特定の特性に基づいてタイプのグループ登録を実行できます。

あなたの登録は次のようになると思います:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly)
    .BasedOn<IEmployeeService>()
    .LifeStyle.Singleton

インターフェイスのように基本型を実装する場合はIService、次の構成を使用して一度にすべてを登録できます。

AllTypes.FromAssembly(typeof(EmployeeService).Assembly)
    .BasedOn<IService>()
    .WithService.FromInterface()
    .LifeStyle.Singleton

その他の例については、記事を参照してください。これには、可能性が何であるかについての非常に良い説明があります。

于 2010-11-01T15:39:19.403 に答える
5

私はPieterの答えを少しだけ進めて(彼が示唆したように、重要な点はAllTypes)、これを思いつきました:

// Windsor 2.x
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl")
    .Where(type => type.IsPublic)
    .WithService.FirstInterface()
    );

MyApp.ServicesImpl.dllこれは、アセンブリ内のすべてのパブリック クラスを通過し、実装する最初のインターフェイスを使用してコンテナーにそれぞれを登録します。サービス アセンブリ内のすべてのクラスが必要なので、マーカー インターフェイスは必要ありません。

上記はWindsorの古いバージョンで機能します。最新バージョンのコンポーネントを登録するための現在のキャッスル ウィンザー ドキュメントでは、次のことが提案されています。

// Windsor latest
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl")
    .Where(type => type.IsPublic) // Filtering on public isn't really necessary (see comments) but you could put additional filtering here
    .WithService.DefaultInterface()
    );
于 2010-11-02T09:09:37.930 に答える