使用Autofac进行物业注入的正确方法

时间:2014-11-10 20:15:01

标签: c# autofac

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

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

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

1 个答案:

答案 0 :(得分:1)

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

如果有很多人在依赖注入方面出错,那就必须将其用于自动化。 DI的目标不是从代码中删除魔法。如果有的话,情况正好相反。

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

接下来,OOP中的接口用于表示对象可以执行的操作。注入绝对不是一个对象可以采取的动作,而是强加在一个对象上的东西。即使这是解决问题的快捷方式,我也不会使用它,因为它会使代码结构变性。

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

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