无法解析ApplicationDbContext中的类型服务

时间:2016-04-25 15:08:46

标签: c# asp.net-core entity-framework-core

当我尝试使用dnx ef migrations add Mig添加迁移时,我在控制台中有以下异常:

  

无法解析类型的服务   尝试时'Microsoft.AspNet.Http.IHttpContextAcccessor'   激活'NewLibrary.Models.ApplicationDbContext'。

我的 ApplicationDbContext

public class ApplicationDbContext : DbContext
{
    private readonly IHttpContextAccessor _accessor;

    public ApplicationDbContext(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }
}

有什么问题?

我应该如何正确地将依赖项添加到ApplicationDbContext构造函数?

2 个答案:

答案 0 :(得分:1)

DI不会通过命令行设置,这就是你得到上述异常的原因。

在评论中,您解释说您希望通过HttpContext访问IHttpContextAccessor,这通常是在运行时提供的。

迁移不会在运行时应用,其中DI已经配置并且可用。

您可能需要阅读Configuring a DbContext。本文档适用于EF7及以上版本

答案 1 :(得分:1)

我发现这个论坛引导我找到以下解决方案:https://github.com/aspnet/EntityFrameworkCore/issues/4232

创建一个新的服务类和接口:

    using Microsoft.AspNetCore.Http;
    using MyProject.Interfaces;
    using System.Collections.Generic;
    using System.Linq;

    namespace MyProject.Web.Services
    {
        public interface IUserResolverService
        {
            string GetCurrentUser();
        }

        public class UserResolverService : IUserResolverService
        {
            private readonly IHttpContextAccessor _context;
            public UserResolverService(IEnumerable<IHttpContextAccessor> context)
            {
                _context = context.FirstOrDefault();
            }

            public string GetCurrentUser()
            {
                return _context?.HttpContext?.User?.Identity?.Name ?? "unknown_user";
            }
        }
    }

并将其注册到您的DI容器(例如Startup.cs)

    services.AddTransient<IUserResolverService, UserResolverService>();

然后在您的DbContext中,使用userResolverService获取用户名而不是IHTTPContextAccessor

    private readonly IUserResolverService userResolverService;
    public ApplicationDbContext(IUserResolverService userResolverService) : base()
    {
        this.userResolverService = userResolverService;

        var username = userResolverService.GetCurrentUser();
...