为了更好地理解如何在json / xml配置中使用Autofac,我正在创建一个支持插件的小型示例应用程序。该解决方案包含以下程序集:(1)BusinessLogic.Interfaces,(2)BusinessLogic1,(3)BusinessLogic2,(4)DependencyInjection和(5)视图。后者是一个简单的Winforms程序集,我可以用它来测试应用程序。
程序集“BusinessLogic.Interfaces”只包含一个接口IFoo。两个BusinessLogic程序集都只包含一个类型Foo,它们都实现了IFoo。通过这种设置,我可以配置DI容器,为我提供适当的IFoo实现。根据{{3}}上的文档,我获得了以下用于阅读配置文件的代码
private static ContainerBuilder CreateBuilderFromConfigFile()
{
var config = new configurationBuilder();
config.AddJsonFile("autofac.json"); //BTW, requires m_a_n_y nuget packages
var module = new ConfigurationModule(config.Build());
var builder = new ContainerBuilder();
builder.RegisterModule(module);
return builder;
}
使用以下配置
{
"components": [{
"type": "BusinessLogic2.Foo, BusinessLogic.Interfaces",
"services": [{
"type": "BusinessLogic.Interfaces.IFoo, BusinessLogic.Interfaces"
}]
}]
}
在Class DependencyInjection.DiContainer中,我使用
public void Initialize(Containerbuidler builder)
{
Container = builder.Build(); //definition 'Container' not shown here
}
当程序集View与BusinessLogic1和BusinessLogic2链接时,此代码可以正常工作。在json文件中,我可以轻松更改要使用的实现。
如果我从View程序集的引用中删除BusinessLogic2,我会遇到问题。我在命令'builder.Build()'上得到一个InvalidOperationExecption。这是合理的,因为请求的类型位于尚未加载的程序集中。因此我使用反射加载程序集。在Autofac site之后,我添加了以下方法
private static void LoadAddons(string searchInFolder, string pattern)
{
foreach(var fileName in Directory.GetFiles(searchInFolder, pattern))
{
Assembly.LoadFrom(fileName);
}
}
现在,在main方法中,我首先调用方法LoadAddons,然后调用CreateBuidlerFromConfigFile。在Visual Studio的模块视图(调试 - > Windows - >模块)中,我看到已加载BusinessLogic2,但仍存在InvalidOperationException。
修改异常消息是: “Autofac.Configuration.dll中发生了'System.InvalidOperationException'类型的未处理异常 其他信息:找不到“BusinessLogic2.Foo,BusinessLogic”类型。它可能需要装配认证,例如“MyType,MyAssembly”。 如何告诉使用xml / json配置的Autofac注册动态加载的类型?“