【问题标题】:Proper way for property injection using Autofac使用 Autofac 进行属性注入的正确方法
【发布时间】:2014-11-10 20:15:01
【问题描述】:

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

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

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

【问题讨论】:

标签: c# autofac


【解决方案1】:

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

如果有很多人对依赖注入有错误的地方,那就必须使用它来实现自动化。 DI 的目标不是消除代码中的魔力。如果有的话,情况恰恰相反。

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

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

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

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

【讨论】:

  • 正如 Etienne 所解释的,最干净的方法是将每个对象单独注册到 IoC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多