在没有 EF Core 引用的 ASP.NET 项目中使用 EF 存储?

Using EF stores in an ASP.NET project without EF Core reference?

在 EF Core 中使用默认 ASP.NET 身份的推荐方法涉及将以下内容放入 ASP.NET 应用程序 Startup class 的 ConfigureServices 方法中:

services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

这需要 2 个看起来不属于 ASP.NET Web 项目(表示层项目)的东西:对 EF Core 的引用(以获取 AddEntityFrameworkStores 扩展方法),以及对 ApplicationDbContext 的引用(我认为这应该是持久层中数据访问代码的内部)。

我如何才能避免这些引用并正确分离问题,同时仍将此配置用于我的网站标识?

值得注意的是,在 .NET Core 中,引用是可传递的。这意味着如果 WebProj 引用 BLLProj 并且 BLLProj 引用 DALProj:

WebProj -> BLLProj -> DALProj

然后 WebProj 仍然从 DALProj 获得所有引用。

话虽如此,您可以按照 AddDbContext 扩展方法在您的代码中工作的相同方式将其配置委托给您的数据项目。这意味着 Web 项目不会直接引用任何 DAL 对象。

例如,在您的 BLL 层或什至是一个完全独立的项目中,您可以有一个扩展方法将您的服务添加到 DI 容器,例如:

public static class ServiceCollectionExtensions
{
    public static void AddDataAndIdentity(this IServiceCollection services, IConfiguration config)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                config.GetConnectionString("DefaultConnection")));

        services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();
    }
}

然后在您的网络项目中,在 ConfigureServices 方法中调用它:

services.AddDataAndIdentity(Configuration);

此外,还有一些工具可以帮助您可视化项目依赖关系。如果你有Visual Studio企业版,你可以create a code map. Other tools such as ReSharper也可以帮忙。