2013-02-26 42 views
0

我試圖創建一個IWindsorContainer工廠執行與應用程序打包所有的安裝程序(即在bin文件夾中的所有內容)執行從所有組件安裝在應用程序

它需要的工作:

  1. 一個Windows客戶端應用程序(可能或可能不會使用ClickOnce安裝)
  2. Windows服務
  3. 基於NUnit的集成測試套件(可能有R#運行而發展中國家)
  4. ASP.NET MVC應用程序

FromAssembly.InThisApplication()將無法​​正常工作,因爲這不是「根」組件(有可能甚至不根assemly)

我的第一個,幼稚的做法是:

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,共享庫例子)等

其他安裝程序被包含在根特異性項目或庫(例如,MyCompany.Data包含NHInstaller用於查找返回NH配置使用它來創建會話工廠的方法)

換言之,這個「元安裝程序」應該找到當前應用程序中的所有安裝程序並運行它們。我只是想找到一種方法來避免複製&粘貼。

+1

哪裏呢驗證碼現場?爲什麼你堅持在所有這些應用程序之間共享代碼?您很可能不希望在Windows服務和Web應用程序之間使用相同的安裝程序。安裝人員的意圖是特定於應用程序 – 2013-02-26 21:14:48

+0

@KrzysztofKoźmic我希望你能在:-)看到增加的信息。 – 2013-02-27 14:02:30

回答

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"); 
相關問題