首页 > 解决方案 > 具有依赖注入的 EF 核心 DbContext

问题描述

我创建了一个可注入的 dbcontext

启动.cs:

    public void ConfigureServices(IServiceCollection services) {
        services.AddScoped<IUnitOfWork, UnitOfWork>();

        services.AddDbContext<DBContext>(options => options.UseSqlServer("Server=localhost;Database=mydb;Trusted_Connection=True;"));
    }

工作单位:

 public class UnitOfWork : IUnitOfWork {
    private readonly DBContext _context;
    public UnitOfWork(DBContext context) {
        _context = context;
    }

控制器中的注入工作正常:

  public class UserController : ControllerBase {
    private readonly IUnitOfWork unitOfWork;
    public UserController(IUnitOfWork unitOfWork) {
        this.unitOfWork = unitOfWork;
    }
  }

如何创建在构造函数中采用 IUnitOfWork 并从主程序调用它的自定义类?

自定义类:

  public class CustomClass {
    private readonly IUnitOfWork unitOfWork;
    public CustomClass(IUnitOfWork unitOfWork) {
        this.unitOfWork = unitOfWork;
    }
}

主程序:

    public class Program {
    public static void Main(string[] args) {
        var unitOfWork=new UnitOfWork()  // Here I don't want to pass new DBContext I want to reach the same injected DBContext 
        var customClass =new CustomClass (unitOfWork);

    }
}

标签: c#asp.net-coreentity-framework-core

解决方案


首先,将您的代码从ConfigureServicesWeb 和控制台项目都可以使用的某个共享库中移出。创建扩展方法来配置您的所有服务。

using Microsoft.Extensions.DependencyInjection;

namespace ConsoleApp13
{
    public static class ConfigureServicesExtensions
    {
        public static void ConfigureMyServices(this IServiceCollection serviceCollection)
        {
            serviceCollection.AddDbContext<ApplicationDbContext>();

            serviceCollection.AddScoped<IUnitOfWork, UnitOfWork>();
            serviceCollection.AddScoped<CustomClass>();
        }
    }
}

这就是您的控制台应用程序的外观

using Microsoft.Extensions.DependencyInjection;

namespace ConsoleApp13
{
    class Program
    {
        static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();

            serviceCollection.ConfigureMyServices();

            using var serviceProvider = serviceCollection.BuildServiceProvider();
            using var scope = serviceProvider.CreateScope();

            var myService = scope.ServiceProvider.GetService<CustomClass>();
        }
    }
}

还有你的网络项目

public void ConfigureServices(IServiceCollection services)
{
    services.ConfigureMyServices();
}

推荐阅读