从应用程序中的所有程序集执行安装程序

时间:2013-02-26 18:15:53

标签: asp.net castle-windsor integration-testing

我正在尝试创建一个IWindsorContainer工厂,该工厂执行随应用程序打包的所有安装程序(即bin文件夹中的所有内容)

它需要适用于:

  1. Windows客户端应用程序(可能与Clickonce一起安装,也可能不安装)
  2. Windows服务
  3. 基于NUnit的集成测试套件(可能在开发时使用R#运行)
  4. ASP.NET MVC应用程序
  5. 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的一部分,GenericFactoryInstaller是由不同项目类型共享的库,包含......井,DI相关的东西,用于所有地方使用的东西的安装程序(例如MyCompany.Data),等

    其他安装程序包含在特定的根项目或库中(例如,NHInstaller包含{{1}},它找到返回NH配置的方法,用于创建会话工厂)

    换句话说,这个“元安装程序”应该找到当前应用程序中的所有安装程序 并运行它们。我只是想找到一种避免复制和粘贴的方法。

1 个答案:

答案 0 :(得分: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");