【问题标题】:Using EF stores in an ASP.NET project without EF Core reference?在没有 EF Core 参考的情况下在 ASP.NET 项目中使用 EF 存储?
【发布时间】:2020-01-08 03:17:00
【问题描述】:

在 EF Core 中使用默认 ASP.NET 标识的推荐方法是将以下内容放入 ASP.NET 应用程序的 Startup 类的 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 中,引用无论如何都是可传递的。因此,即使 ProjA 引用 ProjB 并且 ProjB 引用 ProjC,ProjA 仍然会从 ProjC 获取所有引用。话虽如此,您可以将其配置委托给您的数据项目,就像AddDbContext 扩展方法在您的代码中的工作方式一样。
  • 不要使用直接依赖于您不想引用的项目中的对象的代码。您也可以使用图表工具来提供帮助。
  • PrivateAssets 在这里帮不了你。这几乎只会控制与您的项目一起发布的内容。但是,当您有像 Web -&gt; BLL -&gt; DAL 这样的传递依赖时,Web 项目将绝对需要在运行时访问 DAL。这就是 .NET 的工作原理。 Core 并不是什么新鲜事。
  • 那么您不应该真正想要的是您的存储库代码能够访问应用程序服务或 Web 控制器。
  • 你必须尊重你自己的约束,即使其中一些没有被编译器强制执行。如前所述,瞬态依赖使最外层的项目能够访问所有内容。

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


【解决方案1】:

值得注意的是,在 .NET Core 中,引用是可传递的。这意味着如果WebProj 引用BLLProjBLLProj 引用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 mapReSharper 等其他工具也可以提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2016-09-19
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多