我正在尝试创建一个IWindsorContainer
工厂,该工厂执行随应用程序打包的所有安装程序(即bin
文件夹中的所有内容)
它需要适用于:
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配置的方法,用于创建会话工厂)
换句话说,这个“元安装程序”应该找到当前应用程序中的所有安装程序 并运行它们。我只是想找到一种避免复制和粘贴的方法。
答案 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");