我的解决方案有6个项目,并且我有一个单独的数据访问项目,我的数据访问项目包含DbContext
,但我也希望AddIdentity
的启动类中也包含DbContext
public void ConfigureServices(IServiceCollection services)
{
//I dont have access to DbContext in this project
services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<ILoginService, LoginService>();
services.AddSingleton<IAuthService, AuthService>();
}
我可以想到两种解决此问题的方法
DbContext
中的Startup.cs
,但我创建了一个单独的数据访问项目,我认为这会破坏拥有单独项目的整个目的。services.AddIdentity
可用的项目中添加DbContext
,但我不确定这样做是否可行?解决此问题的最佳方法是什么?还是可以添加services.AddIdentity
而不必访问DbContext
?
答案 0 :(得分:1)
包含Startup
类的项目是每个ASP.NET Core项目的composition-root。
它旨在用于配置所有服务和依赖项,因此必须具有所有必要的引用。
如果您希望库仅包含接口和实现这些接口的其他库,那么这也不是问题,并且也打算这样做。
Microsoft使用Logging-Library Microsoft.Extensions.Logging进行此操作的方式相同。他们总是有抽象,只包含所谓的Contract
。然后是另一个使用合同的实施项目。在组合根中注册ILoggerFactory
和ILogger<TCategory>
时,从属库只能依赖抽象,因此只需要引用项目Microsoft.Extensions.Logging.Abstractions
,然后注入ILogger<TCategory>
。 / p>
在您的情况下,ApplicationDbContext
源自DbContext
。
通过添加此行,您可以将其注册为组成{_1}}而不是派生类的组合根目录。
DbContext
现在,服务可以使用通用方法services.AddDbContext<ApplicationDbContext, DbContext>() // mor config here
注入DbContext
并从中查询
如果您需要更具体的示例,请随时克隆我的pet-projects之一。