使用Autofac进行属性注入的正确方式



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

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

我的首选方法(out of lazyness…)是有一个通用接口,我可以向Autofac注册。

我对Autofac不太熟悉,所以我会根据我所知道的情况向您推荐我最好的产品。

如果很多人在依赖注入方面有一点错的话,那就是必须将其用于自动化。DI的目标不是从代码中去除魔法。如果说有什么不同的话,那就是恰恰相反。

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

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

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

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

最新更新