在没有 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也可以帮忙。
在 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也可以帮忙。