Как удалить зависимость из EntityFrameworkCore 3 в ASP. NET core 3.1 - PullRequest
1 голос
/ 14 января 2020

Мой уровень доступа к базе данных EF-Core и ASP. NET Базовое приложение находятся в разных проектах. Я пытаюсь подключить слой доступа к базе данных к веб-приложению и получить код

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<DatabaseContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("Connection")));

    services.AddScoped<IMyDbContext, DatabaseContext>();
    services.AddScoped<IUserService, UserService>();
    services.AddScoped<IPlanService, PlanService>();

    services.AddControllersWithViews();
}

К сожалению, это добавляет зависимость от библиотеки EntityFrameworkCore. Как перенести DI-подключение вне веб-приложения в проект базы данных?

Я использовал аналогичный подход в ASP. NET MVC (не Core) проекте с Unity DI, был UnityContainerExtension класс для этого. Мой старый пример

DI-подключение в слое базы данных

 public class SharedUnityRegistry : UnityContainerExtension
    {
        private readonly Func<Type, LifetimeManager> _lifeTimeManager;

        public SharedUnityRegistry(Func<Type, LifetimeManager> lifetimeManager)
        {
            _lifeTimeManager = lifetimeManager;
        }

        protected override void Initialize()
        {
            Container.RegisterTypes(
                AllClasses.FromLoadedAssemblies().Where(type => typeof(DatabaseContext).IsAssignableFrom(type)),
                WithMappings.FromAllInterfaces,
                WithName.Default,
                _lifeTimeManager);            
        }
    }

DI-подключение в ASP. NET веб-проекте, без зависимости от EF

  UnityContainer.AddExtension(new SharedUnityRegistry(lifetimeManager => new HierarchicalLifetimeManager()));

Ответы [ 2 ]

2 голосов
/ 14 января 2020

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

Проект базы данных:

public static class Extensions
{
    public static IServiceCollection UseMyDatabase(this IServiceCollection services, string connectionString)
    {
        services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(connectionString));
        return services;
    }
}

Startup.cs:

services.UseMyDatabase(Configuration.GetConnectionString("Connection"));
0 голосов
/ 14 января 2020

В этом проекте Я решил эту проблему следующим образом:

  • Создать интерфейс IStartupRegistrator , который вызывается во время запуска приложения. Это позволяет спутниковым сборкам регистрировать свои службы без необходимости принимать решение при запуске.
  • Реализация доступа к данным EF уровень, который НЕ знает о базовой базе данных
  • Создайте выделенный контекст данных (с миграциями) для поддерживаемых БД. В моем случае Ms Sql, Sqlite и в памяти (используется для модульных тестов). Используемая БД устанавливается в настройках приложения, и каждый поставщик БД решает, должен ли он сам регистрироваться; например, здесь

Обратите внимание, что только проекты в пространстве имен Sppd.TeamTuner.Infrastructure.DataAccess ссылаются на ядро ​​EF. Для справки: из-за этого я не смог использовать asp. net удостоверение личности.

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