C# 使用Autofac进行属性注入的正确方法

C# 使用Autofac进行属性注入的正确方法,c#,autofac,C#,Autofac,我正在用Autofac和EntityFramework构建一个MVC应用程序。我有一大组使用我的日志接口(NLog)的数据存储库/业务对象。我刚刚开始与Autofac合作,希望了解财产注入的首选方式: 将iLogg作为构造函数属性传递,为此,我必须从构造函数中设置每个本地属性,并创建更大的构造函数封装 使用Autofac单独注册每个对象(它们不共享通用接口) 使用Autofac.模块定位这些对象,并使用反射设置属性 创建一个通用接口ILogger Dependency并将其注册到Autofac

我正在用Autofac和EntityFramework构建一个MVC应用程序。我有一大组使用我的日志接口(NLog)的数据存储库/业务对象。我刚刚开始与Autofac合作,希望了解财产注入的首选方式:

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

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

我对Autofac不太熟悉,因此我将根据我所知道的,尝试向您提供我的最佳推荐

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

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

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

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


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

这个问题有帮助吗?正如Etienne所解释的,最干净的方法是向IoC单独注册每个对象。