Можно ли добавить службы в другой проект в ядре .net? - PullRequest
0 голосов
/ 08 мая 2019

Мое решение имеет 6 проектов, и у меня есть отдельный проект для доступа к данным, мой проект доступа к данным содержит DbContext, но я хочу, чтобы DbContext также был в моем классе запуска для AddIdentity

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 Ответ

1 голос
/ 09 мая 2019

Проект, содержащий класс Startup, является составным корнем каждого проекта ASP.NET Core.

Он предназначен для настройки всех служб и зависимостей, поэтому для него должны быть указаны все необходимые ссылки.

Если вы хотите, чтобы библиотеки содержали только интерфейсы, и другие библиотеки, реализующие эти интерфейсы, это тоже не проблема, и это также должно быть сделано таким образом.

Microsoft делает то же самое, например, с Logging-Library Microsoft.Extensions.Logging . У них всегда есть абстракции, которые содержат только так называемые Contract. Тогда есть другой проект внедрения, который использует контракты. При регистрации ILoggerFactory и ILogger<TCategory> в корне композиции зависимая библиотека может опираться только на абстракции и поэтому должна ссылаться только на проект Microsoft.Extensions.Logging.Abstractions, а затем вводить ILogger<TCategory>.

В вашем случае ApplicationDbContext происходит от DbContext.

Вы можете зарегистрировать его в составном корне, чтобы разрешить его как DbContext, а не как производный класс, добавив эту строку.

services.AddDbContext<ApplicationDbContext, DbContext>() // mor config here

Теперь служба может внедрить DbContext и запросить его с помощью универсального метода DbContext.Set<TEntity>

Если вам нужны более конкретные примеры того, как это сделать, не стесняйтесь клонировать один из моих pet-проектов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...