0

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

它需要为:

  1. Windows 客户端应用程序(可能与 Clickonce 一起安装也可能不安装)
  2. Windows 服务
  3. 基于 NUnit 的集成测试套件(可以在开发时使用 R# 运行)
  4. 一个 ASP.NET MVC 应用程序

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例如)等。

其他安装程序包含在特定的根项目或库中(例如,MyCompany.Data包含NHInstaller找到返回 NH 配置的方法的方法,因为它使用它来创建会话工厂)

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

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 回答