问题标签 [autofac-module]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
960 浏览

autofac - Autofac 模块实现 - 连接字符串

简介: - 我是编程新手,我经常使用构造函数注入和工厂模式。这将是我第一次为 DI 使用第三方工具 Autofac。我了解基础知识,但我正在寻找对一些事情的理解,希望您能提供帮助。

项目设置: N-Tier MVC 应用程序(数据、模型、测试、UI 项目)(NuGet Autofac 和 Autofac.MVC5 仅安装在 UI 项目中)

问题: Autofac 应该通过 NuGet 安装在我的 N-Tier MVC 应用程序中的每个项目中,还是只是在 UI 项目中安装它好吗?我正在试验 Modules 并好奇我的 DataAccessModule 是否应该放在我的 Data 项目和 UI 项目中。

多部分问题: 我正在尝试将连接字符串注入我的存储库,但我不确定我是否正确执行此操作。根据在我的 Web.config 文件中设置的 RepositoryType 值注册存储库。我在示例中使用 ADO 和存储过程。阅读有关 Autofac.Module 的信息,我认为这是要走的路。

自动配置

数据存取模块

存储库

  • 我对如何实现我的模块并传入连接字符串还有很长的路要走吗?
  • 我是否应该将我的连接分成一个单独的类,该类使用 GetConnectionString 方法实现接口并解析它并将实例范围设置为单个实例而不是我拥有它的方式?
  • 存储库应该使用 InstancePerRequest 还是 InstancePerLifetimeScope?我在一些例子中都看到过,所以我只想知道什么是最好用的以及为什么/何时

问题:我应该在项目中 看到“ new ”关键字的任何地方尝试注入该依赖项吗?例如,在我的存储库中,SqlConnection 或 SqlCommand 对象?

您可以提供的任何帮助或指导将不胜感激。我尝试执行一个非常基本的示例,以更好地了解如何配置其他组件

先感谢您!

0 投票
0 回答
1828 浏览

c# - 无法加载文件或程序集 MongoDB.Drive。该系统找不到指定的文件

我正在尝试在我的 asp.net c# 应用程序中使用 Mongodb。我正在使用 Autofac 来解决依赖关系。当 autofac 尝试解析对象构造函数时出现以下错误。

json中的autofac模块详细信息:

错误:

谁能请我在这里做错了什么?

谢谢

0 投票
1 回答
150 浏览

c# - 无法使用非核心项目解析 startup.cs 中的选项

我有asp net webapi,我需要解决启动文件中的一些选项。这里的选项有一个简单的类,它从 json 配置中获取参数。在启动时注册 optionsAutofacModule where register configuration section 我需要什么。示例:RegisterConfigurationOptions<IdentitySettings>(builder, configuration.GetSection("Identity"));在 OptionAutofacModule 中,使用containerBuilder.RegisterModule<OptionsAutofacModule>();在启动 .cs 中调用的 . 所以,我需要访问startup.cs中方法内的“identitysettings”。

编辑 0:我有 net core 项目和经典的 asp net web api。Net core 项目使用配置,从 json 文件解析什么。我可以使用 IOptions 在控制器经典 .net webapi 项目中访问此配置。但我无法在 startup.cs 中访问此选项

0 投票
1 回答
102 浏览

asp.net-web-api2 - 有没有办法知道控制器是否注册了 IAutofacAuthorizationFilter

我们正在使用 Autofac 的 IAutofacAuthorizationFilter 构建授权过滤器,我们已经在启动时使用我们的基本控制器注册了这个过滤器。所有控制器都继承自我们的基本控制器。我们在执行过程中需要确定目标控制器是否已向 CustomAuthFilter 注册。我尝试使用反射来检查控制器是否注册了CustomAuthFilter,我无法获得。他们是否有更好的方法来检查控制器是否已向 CustomAuthFilter 注册。

0 投票
1 回答
1372 浏览

.net-core - 在 Autofac 中注册回调并在回调中再次构建容器

我有一个 dotnet 核心应用程序。我Startup.cs在 Autofac 中的寄存器类型/实现。我的一个注册需要事先访问服务。

困境是,当我不得不.RegisterMyInfrastructureService使用ISettingsReader<string>之前注册的东西时(Autofac 容器尚未构建)。

我正在阅读有关在构建 autofac 容器后注册回调以执行某些内容的信息。所以我可以做这样的事情:

但问题是,在我想使用该服务之后,不要执行启动服务或类似操作,而是继续注册需要我现在能够提供的设置的东西。

我可以简单地builder.Build()在回调结束时再次调用,以便简单地重建容器而没有任何问题吗?这似乎有点奇怪,因为构建器已经构建(这就是执行回调的原因)。

用autofac处理这种困境的最佳方法是什么?

更新 1:我读到像 builder.Update() 这样的东西现在已经过时了,因为容器应该是不可变的。这证实了我的怀疑,即构建容器、添加更多注册并再次构建不是一个好习惯。

换句话说,我可以理解,不应该使用注册构建回调来注册额外的东西。但是,问题仍然存在:如何处理这些问题?

0 投票
1 回答
111 浏览

c# - 在解决方案中放置 Autofac 模块类

我一直在阅读大量 DI 和 autofac 的示例代码。我注意到的一件事是许多人将接口和实现捆绑在同一个项目中。从设计的角度来看,我认为这是不正确的,所有接口都应该单独组装。所以我这样定义我的项目:

UI - Web App/Windows App/Both - Views - Models - Controllers/ ViewModels Business - Services/Processes - Interfaces - Model DataAccess - Repositories & UoW - Interfaces - Model

这样,我的业务服务仅引用 DataAccess 接口和模型,但独立于实际实现。同理,UI也只指业务接口和模型,有明确的分离。这也有助于我测试可以独立测试层的位置。

我的问题是 Autofac 模块声明。我需要设置我的构建以将实现复制到最终部署目录中。我的业务模块需要参考数据访问实现,UI需要访问业务模块。

  1. 我应该如何处理模块中的这种依赖链?
  2. 我应该在哪里放置模块类以及启动代码应该如何以最简单的方式发现所有模块?

我正在考虑 Autofac 的程序集扫描,但不确定这是否是唯一的选择。另请注意,我已经遵循命名约定,并且在大多数情况下,我不会编写单独的绑定。我在这里担心的是

  1. 由于引用接口的项目不知道实现,因此我无法在调用程序集中编写任何特定绑定,例如 UI 根程序集。
  2. 一些消息来源谈到保持程序集与任何 DI 实现无关,并为模块提供单独的程序集。这对所有类型的应用程序都是一个好方法吗?(例如,企业 LOB 应用程序或 Web 应用程序与分发给许多独立用户的 ISV 桌面应用程序)
0 投票
1 回答
50 浏览

autofac - 如何在激活时获取 autofac 组件的构造函数参数

我想要的是为我所有装饰有一些属性的组件创建缓存代理。所以,我制作了这样的 Autofac 模块:

我无法工作的是:我无法使用参数化构造函数创建代理实例,有什么办法可以做到这一点吗?

0 投票
1 回答
145 浏览

c# - 模块的依赖

我正在学习 AutoFac。我喜欢模块的想法。根据我的理解,例如,我可以创建一个模块,将我的应用程序依赖项的某些部分注册到容器中,以在它之上创建一些抽象。但是,我真的不知道在我有多个模块的情况下该怎么做。

  1. 首先,我是否应该创建一个单独的 LoggerModule 来执行此操作:

    builder.RegisterType<'MyLogger>().As<'ILogger>();

还是应该直接放在组合根中?这个问题来自我的困惑,如果在相同的组合根级别上注册模块(更高抽象)和服务(更低抽象)是一个好主意。是否应该只为使用许多依赖项的服务创建模块,以简化组合根级别的注册?

  1. 另一件事:我的其他注册需要 ILogger 的服务的模块呢?我应该假设 ILogger 已经注册并且只是 c.Resolve<'ILogger>() 还是应该再次注册它以便每个模块都注册了所有需要的依赖项?

  2. 我可以创建一个注册其他模块的模块吗?

我试图寻找这些问题的答案,但我只找到了接近的主题,但与我的问题无关。

0 投票
1 回答
1908 浏览

autofac - Autofac 和 NLog 的日志记录模块如何工作?

我对 Autofac 和 Nlog 还很陌生,我需要一些帮助来了解我的 Autofac LoggingModule for Nlog 中发生了什么。由于遵循injecting-nlog-with-autofacs-registergeneric ,它按预期工作。但不仅仅是复制粘贴,我想确保我了解每种方法中发生的情况(Load & AttachToComponentRegistration)。如果您可以查看我的想法并进一步澄清我的任何错误(我很确定),我将不胜感激。先感谢您!

  • 使用 Nlog 的数据库目标
  • 使用 Autofac 进行依赖注入
  • 用于学习的 ASP.NET MVC Web 应用程序
  • Dvd 库应用程序(DvdAdd、DvdEdit、DvdDelete、DvdList)

记录模块


我对里面的代码的理解Load()

c - 提供给表达式的参数c是在其中创建组件的组件上下文(一个 IComponentContext 对象)。可以访问服务或解析组件依赖关系的上下文。

p - 带有传入参数集的 IEnumerable

AsImplementedInterfaces - Autofac 允许其用户显式或隐式注册类型。虽然“ As ”用于显式注册,但“ AsImplementedInterfaces ”和“ AsSelf ”用于隐式注册。换句话说,容器会根据它实现的所有接口自动注册实现。

思考: Load方法代码注册一个新的LogService类(代表“ c ”),logger的类型(代表“ p ”)作为LogService类的构造函数参数

问题:

  • 我上面的想法正确吗?
  • 它应该是 SingleInstance 还是应该/它只会在调用类范围内存在?(我正在考虑我的工作单元)

我对里面的代码的理解AttachToComponentRegistration()

AttachToComponentRegistration方法 - 重写以将特定于模块的功能附加到组件注册。

AttachToComponentRegistration参数:

  • IComponentRegistry componentRegistry - 根据它们提供的服务提供组件注册。
  • IComponentRegistration注册- 描述容器内的逻辑组件。

registration.Preparing - 需要新实例时触发。通过在提供的事件参数中设置 Instance 属性,可以提供该实例以跳过常规激活器。


args = Autofac.Core.PreparingEventArgs - 在激活过程之前触发以允许更改参数或提供替代实例。

Component = PreparingEventArgs.Component 属性- 获取提供被激活实例的组件

Activator = IComponentRegistration.Activator 属性 - 获取用于创建实例的激活器。

LimitType = IInstanceActivator.LimitType 属性 - 获取组件实例已知可转换为的最具体类型。

思考- 据我了解forType,这个变量保存调用类的NameFullName从哪里调用日志服务?

forType 调试器图像

问题:

  • 我的想法forType正确吗?

ResolvedParameter - 可用作提供从容器中动态检索的值的一种方式,例如通过名称解析服务。

思考logParameter- 这是我开始迷路的地方。也是如此,它检查参数是否为 ILog 类型,如果是,它将使用构造函数参数解析它并传入forType变量?

问题:

  • 我对logParameter上面的想法正确吗?

args.Parameters = PreparingEventArgs.Parameters属性 - 获取或设置提供给激活器的参数。

args.Parameters.Union = 使用默认相等比较器生成两个序列的集合并集。返回一个System.Collections.Generic.IEnumerable`1,其中包含来自两个输入序列的元素,不包括重复项。

关于的想法args.Parameters-我现在真的不知道,除了猜测它返回一个参数集合并删除重复项?

问题:

  • 你能帮我谈谈发生了什么args.Parameters吗?

logParameter 调试器图像 Nlog 数据库表图像


日志服务类

日志接口

0 投票
0 回答
71 浏览

c# - 在模块之间共享一个实例

我有两个 autofac 模块 WorldModule 和 RegionModule(继承 Module 的单独类)并覆盖加载功能。两者都必须共享一个 worldService,即使用世界模型(单例)的服务。

这是世界模块类:

在该地区,我想拥有相同的 worldservice 实例。这是区域模块类: