Autofac:如何加载被引用但不直接使用的程序集

2023-11-24

我们使用 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


这应该对你有帮助。它获取 bin 文件夹中的所有程序集,以名称 MyModule 开头。

   //builder.RegisterType(typeof(IFoo)).AsImplementedInterfaces();
        ContainerBuilder builder = new ContainerBuilder();

        string[] assemblyScanerPattern = new[] { @"MyModule.*.dll"};

        // Make sure process paths are sane...
        Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

        //  begin setup of autofac >>

        // 1. Scan for assemblies containing autofac modules in the bin folder
        List<Assembly> assemblies = new List<Assembly>();
        assemblies.AddRange(
            Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "*.dll", SearchOption.AllDirectories)
                     .Where(filename => assemblyScanerPattern.Any(pattern => Regex.IsMatch(filename, pattern)))
                     .Select(Assembly.LoadFrom)
            );


        foreach (var assembly in assemblies)
        {
            builder.RegisterAssemblyTypes(assembly )
                .AsImplementedInterfaces();
        }
        var container = builder.Build();

这也将加载那些甚至没有被引用的程序集。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autofac:如何加载被引用但不直接使用的程序集 的相关文章

  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • 生成 .tail IL 指令的简单 F# 代码是什么?

    我想看看 tailIL 指令 但我一直在编写的使用尾部调用的简单递归函数显然已优化为循环 我实际上是在猜测这一点 因为我不完全确定反射器中的循环是什么样的 我绝对没有看到任何 tail不过操作码 我在项目的属性中检查了 生成尾部调用 我还尝
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D

随机推荐

  • 如何实现像Gallery一样的Horizo​​ntalScrollView?

    I want to implement Horizontal ScrollView with some features of Gallery 在图库中 滚动条在一定距离处成对排列 即如果屏幕上显示三个图像 单击最后一个图像将排列在中心 我
  • 通过自动解锁从类返回锁定的资源

    我想要一个返回指向资源的指针的类成员函数 资源应自动锁定和解锁 我考虑创建一个不可复制的对象来处理锁定 您认为以下是一个好的解决方案吗 它是线程安全的吗 STL 中是否已有适用于此用例的工具 template
  • Scala String* 类型(在函数 args 中)

    我有以下方法 def m a String 我想知道此语法中星号 符号的用途是什么 我显然是 Scala 的新手 我用谷歌搜索 但可能搜索错误的东西 任何帮助表示赞赏 Cheers 它被称为 var args 变量参数 def concat
  • 我可以在批处理脚本中的一个“查找”命令中搜索多个字符串吗?

    我有一个 Windows 批处理脚本 它将在文件中查找字符串 find i WD6 Inputpath file txt if errorlevel 0 GOTO somestuff 目前 这就是我的代码的样子 我遇到了一个新字符串 我想在
  • 如何使用 C#6“使用静态”功能?

    我正在看其中的几个新功能在C 6 具体来说 使用静态 using static is a new kind of using clause that lets you import static members of types direc
  • 关于 NaN 运算的问题

    我的 SSE FPU 生成以下 NaN 当我执行任何基本的对偶运算 如 ADDSD SUBSD MULSD 或 DIVSD 并且两个操作数之一为 NaN 时 结果具有 NaN 操作数的符号 并且结果尾数的低 51 位将加载NaN 操作数尾数
  • Rails:金钱宝石将所有金额转换为零

    我正在尝试使用金钱宝石在我的应用程序中处理货币 但我遇到了一个奇怪的错误 这就是我的 记录 模型中的内容 composed of amount class name gt Money mapping gt w cents cents w c
  • AddWithValue 参数为 NULL 时出现异常

    我有以下代码用于指定 SQL 查询的参数 我使用时遇到以下异常Code 1 但当我使用时效果很好Code 2 In Code 2我们检查是否为空 因此if else block 例外 参数化查询 application ex id nvar
  • 检查字符串是否不为 Null 且不为 Empty

    如何检查字符串是否不是null并且不为空 public void doStuff String str if str null str here I want to check the str is empty or not handle
  • Eclipse“服务器位置”部分已禁用,需要更改为使用 Tomcat 安装

    我已经在 Eclipse 中设置了一个动态 Web 项目 并安装了 Tomcat 5 5 我想将服务器设置为 Tomcat 安装而不是工作区元数据位置 但是当 Eclipse 显示服务器的 概述 屏幕时 服务器位置 部分被禁用 因此我无法更
  • 如何动态地将 swt 小部件添加到组合中?

    我正在尝试通过单击按钮将文本框 按钮等小部件添加到组合中 我已经尝试过 但我只能动态添加这些小部件 最多可达复合材料的大小 我的 jface 对话框是这样的 它有一个滚动的组合 其中包含一个组合 在主要复合材料中 我还有 3 个其他复合材料
  • Android glSurfaceView 使用 XML/Java 进行覆盖

    我启动了一个 Android OpenGL 应用程序 并且有以下类 class A extends Activity class B extends GlSurfaceView implements Renderer 当调用A类的onCre
  • log4j2 JDBC Appender 问题:插入记录失败

    我创建了一个 JDBC 附加程序并绑定 ColumnConfig 和 DataSourceConnectionSource 在尝试在数据库中插入记录时 Logger debug Test 我遇到以下异常 Thanks 6 16 14 18
  • ipython 控制台中的语法高亮显示

    我在用ipython同时在qtconsole并在终端中 In ipython qtconsole 当我输入时import pandas as pd这些单词有语法突出显示 但是 当我在控制台中输入时 所有文本都是白色的 Python 控制台也
  • 如何将模式作为参数传递给sql server中的存储过程?

    我有一个存储过程来根据两个表选择数据列表 第一个表是固定的 CO Country 但第二个表可以是多个表之一 表本身的名称是相同的 Location 但是 表的架构不同 ABD Location CGA Location GBN Locat
  • include() 不适用于所有浏览器

    这是我的代码块 它在 fireFox 和 Chrome 中完美运行 但在 IE 中不行 我收到错误 Object doesn t support property or method includes function rightTreeS
  • 生产代码+测试模块信息=不可能?

    我有一个模拟类 其中包含我从模块提供的服务的简单实现 我正在使用 OpenJDK 11 03 gradle 5 2 1 和 IntelliJ 2019 2 In main code myPackage myService java I ha
  • SQL 2005 Reporting Services 如果检查 null

    在 SSRS 2005 中 我有一个表 其中链接了一个数据集 我想检查字段的值是否为空 如果不为空 则格式化数据以确保它有一位小数并添加 符号等 这是我在现场 专栏上的表达 iif IsNothing Fields COL01 Value
  • 无参数可变参数模板上的不明确重载

    有关的 使用可变参数访问无参数模板函数的不明确重载 简单的可变参数模板函数无法实例化 为什么这个可变参数函数不明确 考虑这对可变参数模板 template
  • Autofac:如何加载被引用但不直接使用的程序集

    我们使用 Autofac for DI 创建了一个 WebApi 解决方案 我们将 autofac 的引导分解为一个单独的项目 这样 我们的 WebApi 项目仅引用我们的 Bootstrap 和 Contracts 项目 然后 我们的引导