簡體   English   中英

如何從 ASP.NET Core 3.1 中的 EntityFrameworkCore 3 中刪除依賴項

[英]How to remove dependency from EntityFrameworkCore 3 in ASP.NET core 3.1

我的 EF-Core 數據庫訪問層和 ASP.NET Core 應用程序在不同的項目中。 我正在嘗試將數據庫訪問層連接到 Web 應用程序並附帶代碼

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 庫的依賴。 如何將 Web 應用程序外部的 DI 接線移動到數據庫項目中?

我在帶有 Unity DI 的 ASP.NET MVC(不是核心)項目中使用了類似的方法,有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);            
        }
    }

ASP.NET web 項目中的 DI 接線,不依賴於 EF

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

您可以為此使用擴展方法並將其放置在您的數據庫項目中。 但是您仍然需要引用您的數據庫項目。

數據庫項目:

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

啟動.cs:

services.UseMyDatabase(Configuration.GetConnectionString("Connection"));

這個項目中,我解決了這個問題:

  • 創建在應用程序啟動期間調用的接口IStartupRegistrator 這允許附屬程序集注冊其服務,而無需在啟動時自行決定。
  • 實現不知道底層 DB 的EF 數據訪問
  • 為受支持的 DB 創建專用數據上下文(帶遷移)。 在我的情況下MsSqlSqlite內存中(用於單元測試)。 要使用的數據庫是在應用程序設置中設置的,每個數據庫提供商決定是否由他自己注冊; 例如這里

請注意,只有命名空間Sppd.TeamTuner.Infrastructure.DataAccess項目引用 EF 核心。 為了記錄:因此,我無法使用 asp.net 身份。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM