繁体   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