0

IWindsorContainerアプリケーションにパッケージ化されているすべてのインストーラー(つまり、binフォルダー内のすべて)を実行するファクトリを作成しようとしています。

それは以下のために働く必要があります:

  1. Windowsクライアントアプリケーション(Clickonceとともにインストールされる場合とされない場合があります)
  2. Windowsサービス
  3. NUnitベースの統合テストスイート(開発中にR#で実行される可能性があります)
  4. 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

言い換えると、この「メタインストーラー」は、現在のアプリケーション内のすべてのインストーラーを見つけて実行する必要があります。コピー&ペーストを回避する方法を見つけようとしています。

4

1 に答える 1

1

最終的に自動インストーラーを削除し、代わりに次の拡張メソッドを作成しました。

public static IWindsorContainer InstallFromAssemblies(
    this IWindsorContainer container, params string[] assemblyNames)
{
    return container.Install(assemblyNames.Select(
        x => (IWindsorInstaller)new AssemblyInstaller(Assembly.Load(x),
                                                      new InstallerFactory()))
                                          .ToArray());
}

したがって、私のアプリケーションタイプ固有のコードは次のようになります。

... = new WindsorContainer().InstallFromAssemblies("A.Reusable.Lib",
                                                   "My.Foo.Services",
                                                   "The.ViewModels",
                                                   "Whatever");
于 2013-03-22T13:29:19.443 に答える