【发布时间】:2015-07-22 11:17:14
【问题描述】:
测试新的 MVC6 和 EF7 框架。
我们的数据库层中经常需要 HttpContext。要在 MVC6 中做到这一点,我们只需有一个如下所示的 DbContext 构造函数:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
HttpContext _httpContext;
public ApplicationUser CurrentUser { get; set; }
public ApplicationDbContext(IHttpContextAccessor httpContextFactory=null)
在我们的 Startup.cs 中我们这样注册我们的 DI:
services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
这很完美......
...直到它没有。运行应用程序时,一切都很好。但是,当我需要使用“dnx .ef migration add”应用一些模型更改时,我们会收到错误消息“没有为此对象定义无参数构造函数。”
好的,没问题。因此,我们添加了一个不带参数的附加构造函数,我们希望仅由迁移过程使用。但是,DI 进程只注册无参数构造函数,因此永远不会传入 HttpContext 对象。
那么如何让 MVC 的默认 DI 模型强制使用带有参数的构造函数呢?并为迁移保留无参数构造函数?
【问题讨论】:
-
虽然我不完全确定,但我不认为 MVC 的默认 DI 支持这一点,因为它并不是一个完全成熟的 DI 容器。 Microsoft 的 Patterns & Practices 中的 Unity 为我提供了很好的服务,并且开箱即用地支持这一点 - 它会自动选择具有最大构造函数的构造函数。
-
- 完全不同的是,
We often need the HttpContext in our database layers.. 正如南方公园的麦基先生所说:“这很糟糕,好吗?” :) -
数据层中需要“网络”内容表明设计不佳。
标签: c# entity-framework dependency-injection asp.net-core-mvc entity-framework-core