【问题标题】:EF7 constructor with MVC6 dependency injection带有 MVC6 依赖注入的 EF7 构造函数
【发布时间】: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&lt;IHttpContextAccessor, HttpContextAccessor&gt;();

这很完美......

...直到它没有。运行应用程序时,一切都很好。但是,当我需要使用“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


【解决方案1】:

基本的 ASP.NET 开箱即用 DI 不支持在注册类时指定调用哪个构造函数(它只解析具有一个公共构造函数的类型)。

您可以为此目的使用更高级的 DI - 即有一个 alpha2 版本的 autofac 可用于 ASP.NET 5 ("Autofac": "4.0.0.0-alpha2", "Autofac.Dnx": "4.0.0 -alpha1")。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多