用于插件的Autofac xml配置

时间:2017-05-14 19:14:25

标签: c# autofac assembly-loading

为了更好地理解如何在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注册动态加载的类型?“

0 个答案:

没有答案