【发布时间】: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 -> BLL -> DAL这样的传递依赖时,Web 项目将绝对需要在运行时访问 DAL。这就是 .NET 的工作原理。 Core 并不是什么新鲜事。 -
那么您不应该真正想要的是您的存储库代码能够访问应用程序服务或 Web 控制器。
-
你必须尊重你自己的约束,即使其中一些没有被编译器强制执行。如前所述,瞬态依赖使最外层的项目能够访问所有内容。
标签: c# asp.net-core entity-framework-core separation-of-concerns