Autofac-通过配置从特定文件夹注册程序集

本文关键字:文件夹 注册 程序集 配置 Autofac- | 更新日期: 2023-09-27 18:25:51

我在配置中通过autofac注册程序集。我想要从另一个文件夹中自动加载程序集,而不是"bin"文件夹。

我试着把它的"类型"属性路径像这样组装:

<component type="Amazon.SQS.AmazonSQSClient, amazonDlls/AWSSDK" service="Amazon.SQS.IAmazonSQS, AWSSDK" />

但我得到了无效程序集名称的错误。

如何从特定文件夹注册程序集?

顺便说一句:我从代码中知道这是可能的,但我想从配置中知道。

Autofac-通过配置从特定文件夹注册程序集

不可能以完全限定的类型名称提供程序集的路径。似乎甚至不可能从不位于"bin"文件夹不同目录的库中注册类型。即使您在与dll相同的文件夹中准备配置文件,也要以这种方式注册和读取:

builder.RegisterModule(new ConfigurationSettinsgReader("<section-name>", "amazonDlls/app.config"));

您将得到未找到类型的异常。

如文档中所述,组件类型的名称是完全限定的类型名称,这是.NET规范定义的格式。完全限定的类型名称不包括路径。

使用现成的配置格式无法指定路径。你有几个选择。

选项1:添加探测路径

默认情况下,.NET仅在应用程序的bin文件夹中搜索程序集。您可以阅读有关.NET如何在MSDN 上定位程序集的信息

.NET允许您通过app.configweb.config:指定其他搜索路径

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin;bin'plugins" />
    </assemblyBinding>
  </runtime>
<configuration>

这些路径必须是bin文件夹的子目录,这样可能不适用于您。

如果它必须在bin文件夹之外(而不是在子目录中),则可以使用<codeBase>元素来指定URL位置。如果这样做,程序集似乎必须有一个强名称,所以请记住这一点。probingPath机制不需要强名称。

当然,加载位于GAC外部和bin文件夹外部指定位置的程序集也存在固有风险。需要考虑的事情。

选项2:创建自己的配置读取器

这将更加困难。您可以获取Autofac.Configuration源,并创建自己版本的配置读取器,其中包括文件位置支持。您可能需要查看Assembly.LoadFrom才能使其发挥作用,但是,同样,这样做也有一些风险。Assembly.LoadFrom文档概述了这些问题。