我们使用 Autofac for DI 创建了一个 WebApi 解决方案。我们将 autofac 的引导分解为一个单独的项目。这样,我们的 WebApi 项目仅引用我们的 Bootstrap 和 Contracts 项目。然后,我们的引导项目引用所有其他程序集并将所有内容连接在一起。我喜欢这种关注点分离的设计。
我们可以手动加载我们的程序集,如下所示 - 其中我们的“AutofacModule”类包含注册每个模块(程序集)所需的信息。
ContainerBuilder builder = new Autofac.ContainerBuilder();
builder.RegisterModule(new Business.AutofacModule());
builder.RegisterModule(new Data.AutofacModule());
builder.RegisterModule(new Services.AutofacModule());
etc...
这可行,但需要对每个程序集进行硬编码。我们正在尝试使其动态化,以便我们可以如下循环遍历所有引用的程序集。
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
foreach (var assembly in assemblies)
{
builder.RegisterAssemblyModules(assembly);
}
这应该有效,但没有。问题是 .Net 确定引导程序项目中实际未使用各种程序集,并且不会加载它们(试图优化?)。所以我们的一些程序集从未被加载。
我还尝试了以下方法来循环 bin 目录以查找所有程序集。但是,在编译期间,.Net 不会将未引用的程序集移动到 bin 目录中,因此它们也不在那里。
string assemblyPath = System.IO.Path.Combine(
System.AppDomain.CurrentDomain.BaseDirectory, "bin");
var allAssemblies = new List<Assembly>();
foreach (string dll in Directory.GetFiles(assemblyPath, "*.dll"))
{
allAssemblies.Add(Assembly.LoadFile(dll));
}
我已将程序集设置为“复制本地”,但这不起作用。我读到了有关“复制本地”错误的信息,并尝试了也不起作用的解决方法。
有人能够解决这个问题吗?看起来 Autofac 会提供一个解决方案,但我发现的只是他们文档上的“待办事项”页面:http://autofac.readthedocs.org/en/latest/faq/isolate-autofac.html
以下两个问题类似,但所提出的解决方案都没有克服所需程序集不在 bin 目录中的事实。
并非所有程序集都从 bin 文件夹加载到 AppDomain 中
加载所有引用的程序集 .NET,即使未在代码中显式使用
最后,我很好奇,这是 Autofac 特有的问题吗?其他DI容器如何解决这个问题?我发现 NInject 也有类似的问题。加载未引用的 dll MVC Ninject