是否可以在.net core的其他项目中添加服务?

时间:2019-05-08 20:05:39

标签: .net asp.net-core .net-core

我的解决方案有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>();
}

我可以想到两种解决此问题的方法

  1. 以某种方式访问​​DbContext中的Startup.cs,但我创建了一个单独的数据访问项目,我认为这会破坏拥有单独项目的整个目的。
  2. 要在services.AddIdentity可用的项目中添加DbContext,但我不确定这样做是否可行?

解决此问题的最佳方法是什么?还是可以添加services.AddIdentity而不必访问DbContext

1 个答案:

答案 0 :(得分:1)

包含Startup类的项目是每个ASP.NET Core项目的composition-root

它旨在用于配置所有服务和依赖项,因此必须具有所有必要的引用。

如果您希望库仅包含接口和实现这些接口的其他库,那么这也不是问题,并且也打算这样做。

Microsoft使用Logging-Library Microsoft.Extensions.Logging进行此操作的方式相同。他们总是有抽象,只包含所谓的Contract。然后是另一个使用合同的实施项目。在组合根中注册ILoggerFactoryILogger<TCategory>时,从属库只能依赖抽象,因此只需要引用项目Microsoft.Extensions.Logging.Abstractions,然后注入ILogger<TCategory>。 / p>

在您的情况下,ApplicationDbContext源自DbContext

通过添加此行,您可以将其注册为组成{_1}}而不是派生类的组合根目录。

DbContext

现在,服务可以使用通用方法services.AddDbContext<ApplicationDbContext, DbContext>() // mor config here注入DbContext并从中查询

如果您需要更具体的示例,请随时克隆我的pet-projects之一。