ASP.NET MVC3中对autofac依赖解析器的全局访问?

Typ*_*son 15 autofac asp.net-mvc-3

我使用Autofac与ASP.NET MVC集成,我的所有控制器都接收依赖项,Autofac自动解析嵌套依赖项.太棒了

但是,如何解决控制器实例化范围之外的依赖关系?在我的代码深处的某些地方,我需要向解析器询问我的Logger.一方面将Logger作为依赖项传递给我创建的每个小对象似乎是错误的,另一方面,依赖于我的代码中的依赖性解析器似乎是错误的

例如,我有一个名为Result的类,它从许多动作返回.它是一个一致的使用对象,我的应用程序代码可以依赖从更深层回来.当更深层次的代码向此对象添加UI错误时,我想自动将其添加到需要解析的记录器中.每个班级都依赖于记录器会妨碍你

任何帮助表示感谢

Nic*_*rdt 37

你正在寻找的是MVC DependencyResolver.Current:

var logger = DependencyResolver.Current.GetService<ILogger>();
Run Code Online (Sandbox Code Playgroud)


Bor*_*cha 7

那么你可以使用事件(发布/子方法),如果每个对象的依赖都会激怒你,但我不认为依赖中央Logger解析器有什么问题.如果你真的需要从每个类登录,那么你肯定可以将日志记录作为应用程序的核心方面,并且你在心理上将其视为其他常见的库类型,如String或Ints,这些类型无处不在,可以安全依赖.但我会建议你别的东西.恕我直言,你应该建立架构,不要登录每个班级.如果您的日志记录仅仅(或大部分)是关于编写错误(例外),那么不要使用它来对您的域模型进行策略.让我们把它放在服务层insteád.这种编排层可以正确地评估每个捕获的异常并仅记录必要的内容.让我们将这些异常冒充到堆栈跟踪中较低的可能位置,并将它们作为最后一件事来处理.

  • 你是对的.它似乎是一个放置日志记录的自然场所,但我只是在课堂上增加了额外的职责.现在我将ui错误添加到BaseController.OnActionExecuted()中的ActivityLog.首先来自ModelState字典.其次,我现在在BaseController中有一个Result对象,所有操作在调用domain/repo方法时都会使用.在OnActionExecuted()中,我将这些错误添加到ActivityLog中.所以它仍然是集中的,但事情都在适当的位置.谢谢你让我远离一个糟糕的解决方案.这样做要好得多,并保持可测试性 (2认同)