【发布时间】:2016-11-15 19:59:56
【问题描述】:
我有一个 4 层的 .NET MVC 应用程序。我正在尝试使用依赖注入(通过 Ninject),但不断意识到我真正考虑的是服务位置。我目前的问题是这样的:
我有依赖注入设置并处理在我的应用程序层(MVC 5 Web 应用程序)中实例化的许多对象。现在,我正在编写审计跟踪插入代码,并希望它是:
public ActionResult Edit(int id)
{
// ...
AuditTrail.LogVisit("Edit Screen", id);
return View();
}
AuditTrail 是表示审计跟踪表的实体框架类(在单独的程序集/层中),LogVisit 是静态方法,因为我不需要现有审计跟踪记录的上下文(这是插入)。
AuditTrail.LogVisit 新建一个 DbContext 短时间插入记录,还需要登录的用户 id。登录的用户 ID 可通过会话获得,我已将其公开为使用 InRequestScope 绑定/注入的类的强类型成员 - 希望这将允许我在会话中保留该值但可以访问它在不知道System.Web 或类似依赖项的更高层中。
我无法在 Audit Trail 类中获取注入的用户 ID 属性/类,因为 DbContext 的创建与 AuditTrail.LogVisit 方法是隔离的。我想避免传入上下文根,因为这似乎不是最佳实践并会产生其他问题。我查看了工厂扩展,但从示例中您仍然没有 static 工厂 - 您有一个提供工厂类实例的实例类。
我可以避免使用静态方法,但是 a) 只会将问题进一步推低(如何在业务层内实例化非静态帮助程序类?)和 b) 似乎限制太多 - 当你需要的时候不能使用静态方法最相关的实现是否位于?
我可以让 MVC 应用程序处理实例化所有依赖项并将它们传递给业务层方法,但这不是依赖注入试图解决的问题吗?
【问题讨论】:
标签: asp.net-mvc ninject n-tier-architecture ninject.web.mvc