C# 在没有EF核心引用的ASP.NET项目中使用EF存储?
将默认ASP.NET标识与EF Core一起使用的推荐方法包括将以下内容放入ASP.NET应用程序的C# 在没有EF核心引用的ASP.NET项目中使用EF存储?,c#,asp.net-core,entity-framework-core,separation-of-concerns,C#,Asp.net Core,Entity Framework Core,Separation Of Concerns,将默认ASP.NET标识与EF Core一起使用的推荐方法包括将以下内容放入ASP.NET应用程序的启动类的ConfigureServices方法中: services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaul
启动
类的ConfigureServices
方法中:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddDbContext(选项=>
options.UseSqlServer(
GetConnectionString(“DefaultConnection”);
services.AddDefaultIdentity(options=>options.SignIn.RequireConfirmedAccount=true)
.AddEntityFrameworkStores();
这需要两件看起来不属于ASP.NET Web项目(表示层项目)的东西:对EF Core的引用(获取AddEntityFrameworkStores
扩展方法)和对ApplicationDbContext
(我认为这应该是持久层中数据访问代码的内部部分)
如何在仍然使用此配置作为我的站点标识的同时正确避免这些引用和分离关注点?值得注意的是,在.NET Core中,引用是可传递的。这意味着如果
WebProj
referencesBLLProj
和BLLProj
referencesDALProj
:
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>();
}
}
此外,还有一些工具可以帮助您可视化项目依赖关系。如果您有Visual Studio Enterprise edition,则可以。其他工具(如)也可以提供帮助。值得注意的是,在.NET Core中,引用是可传递的。这意味着如果
WebProj
referencesBLLProj
和BLLProj
referenceesDALProj
:
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>();
}
}
此外,还有一些工具可以帮助您可视化项目依赖关系。如果您有Visual Studio Enterprise edition,则可以。其他工具(如)也可以提供帮助。请注意,在.NET Core中,引用无论如何都是可传递的。因此,即使ProjA引用ProjB和ProjB引用ProjC,ProjA仍然可以从ProjC获取所有引用有鉴于此,您可以将此配置委托给您的数据项目,方法与
AddDbContext
扩展方法在代码中的工作方式相同。不要在您不想引用的项目中使用直接依赖对象的代码。您也可以使用图表工具提供帮助。PrivateAssets
在这里对您没有帮助。这将非常有用ch只控制项目发布的内容。但是,当您有一个可传递的依赖项,如Web->BLL->DAL
,那么Web项目将绝对需要在运行时访问DAL。这就是.NET的工作方式。这对于Core来说并不是什么新鲜事。您不应该真正希望的是您的存储库代码能够ess是应用程序服务或web控制器。即使编译器没有强制执行某些约束,您也必须尊重自己的约束。如前所述,trasient依赖项使最外部的项目能够访问所有内容。请注意,在.NET Core中,引用无论如何都是可传递的。因此,即使ProjA引用ProjB和ProjB引用ProjC,ProjA仍然从ProjC获取所有引用。话虽如此,您可以将此配置委托给您的数据项目,方法与AddDbContext
扩展方法在代码中的工作方式相同。不要使用直接依赖于您不想引用的项目中的对象的代码。您也可以使用图表工具提供帮助。PrivateAssets
在这方面对您没有帮助。这几乎只能控制项目发布的内容。但是当您有一个可传递的依赖项,如Web->BLL->DAL
,那么Web项目将绝对需要在运行时访问DAL。这就是.NET的工作方式。它对Core来说并不是什么新鲜事至少,您不应该真正希望您的存储库代码能够访问应用程序服务或web控制器。您必须尊重自己的约束,即使其中一些约束不是由编译器强制执行的。正如前面所说的,trasient依赖项使最外部的项目能够访问所有内容。