IWindsorContainer
アプリケーションにパッケージ化されているすべてのインストーラー(つまり、bin
フォルダー内のすべて)を実行するファクトリを作成しようとしています。
それは以下のために働く必要があります:
- Windowsクライアントアプリケーション(Clickonceとともにインストールされる場合とされない場合があります)
- Windowsサービス
- NUnitベースの統合テストスイート(開発中にR#で実行される可能性があります)
- ASP.NETMVCアプリケーション
FromAssembly.InThisApplication()
これは「ルート」アセンブリではないため、機能しません(ルートアセンブリさえない場合があります)
私の最初のナイーブな実装は次のとおりです。
return new WindsorContainer()
.Install(
FromAssembly.InDirectory(
new AssemblyFilter(
Path.GetDirectoryName(
Assembly.GetExecutingAssembly()
.Location))));
これは1と2で正常に機能しましたが、残りは機能しませんでした。
それから私は試してみました:
return new WindsorContainer()
.Install(
FromAssembly.InDirectory(
new AssemblyFilter(
Path.GetDirectoryName(
new Uri(
Assembly.GetExecutingAssembly()
.CodeBase)
.LocalPath))));
これは少なくともASP.NETで機能しますが、シャドウコピーを壊す可能性があります。
シャドウコピーシナリオをサポートするより良い代替手段はありますか?
または、すべての参照が明示的であることを確認して、アイデア全体を忘れてInstall(FromAssembly.InThisApplication())
エントリポイントアセンブリから実行する必要がありますか?
追加情報:
このコードはMyCompany.DI
、さまざまなプロジェクトタイプで共有されるライブラリの一部であり、DI関連のもの、あらゆる場所で使用されるもの(GenericFactoryInstaller
たとえば)のインストーラーなどが含まれます。
他のインストーラーは、特定のルートプロジェクトまたはライブラリに含まれています(たとえば、セッションファクトリを作成するために使用するNH構成を返すメソッドを見つけるがMyCompany.Data
含まれています)NHInstaller
言い換えると、この「メタインストーラー」は、現在のアプリケーション内のすべてのインストーラーを見つけて実行する必要があります。コピー&ペーストを回避する方法を見つけようとしています。