gpt4 book ai didi

c# - 使用 Autofac 进行属性注入(inject)的正确方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:52 26 4
gpt4 key购买 nike

我正在使用 Autofac 和 EntityFramework 构建 MVC 应用程序。我有大量使用我的日志记录接口(interface) (NLog) 的数据存储库/业务对象。我刚开始使用 Autofac,想知道属性注入(inject)的首选方式:

  • 将 ILogging 作为构造函数属性传递,为此我必须从构造函数设置每个本地属性并创建更大的构造函数占用空间。
  • 使用 Autofac 单独注册每个对象(它们不共享通用接口(interface))
  • 使用 Autofac.Module 定位这些对象并使用反射设置属性
  • 创建一个通用接口(interface) ILoggerDependency 并将其注册到 Autofac,这样所有对象都可以轻松注册。

我的首选方法(出于懒惰......)是拥有一个我可以在 Autofac 上注册的通用接口(interface)。

最佳答案

我对 Autofac 不是很熟悉,所以我会根据我所知道的给你最好的建议。

如果很多人对依赖注入(inject)有什么误解,那就是将其用于自动化。 DI 的目标不是消除代码中的魔力。如果有的话,情况恰恰相反。

牢记这一点,我什至不会考虑使用反射,因为它隐藏了大量脆弱的管道。

接下来,OOP 中的接口(interface)旨在表达对象可以做什么。被注入(inject)绝对不是对象可以采取的 Action ,而是强加给对象的东西。尽管这是解决您的问题的一种快速而肮脏的方法,但我会避免使用它,因为它会使您的代码结构变性。

我无法理解您将 ILogging 作为构造函数属性传递的意思。基本上,你的意思是在构造函数中自己解析接口(interface)?这看起来很像属性注入(inject),它通过在类中添加对容器的强依赖性来破坏 DI 的目的。基本上,您不再依赖 Log4Net,而是最终依赖 Autofac。要解决这个问题,您需要添加一个服务定位器,然后您仍然会遇到类似的问题。你如何注入(inject)你的服务定位器?

这就是我要单独注册每个对象的原因。它让你的容器完成它的工作。它不会影响您的代码结构和抽象。它不使用反射(魔法)。它不会强制您在每个类中依赖您的容器。此外,它还为您提供了一个集中位置,供您在代码中添加或删除存储库时查找。

关于c# - 使用 Autofac 进行属性注入(inject)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26852223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com