带有依赖项注入的EF核心DbContext

时间:2020-10-23 17:42:38

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

我已经创建了一个可注入的dbcontext

Startup.cs:

First difference is at index: 4

UnitOfWork:

    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;
    }

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

CustomClass:

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

主程序:

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

3 个答案:

答案 0 :(得分:3)

首先,将您的代码从ConfigureServices移到一些可以由Web和Console项目使用的共享库。创建扩展方法以配置所有服务。

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();
}

答案 1 :(得分:0)

您所要做的只是将您的类添加到Dependecy注入容器中,然后将其注入到构造函数中,就不需要在控制器中注入IUnitOfWork。

services.AddScoped<CustomClass>();

然后在您的constroller构造器中

public class UserController : ControllerBase {
  private readonly CustomClass _CustomClass;
  public UserController(CustomClass customClass) {
      _CustomClass = customClass;
  }
}

之后,您便可以在类方法中使用该类

答案 2 :(得分:0)

我会尝试这样的事情:

public class Program {
    public static void Main(string[] args) {
    
    var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
    optionsBuilder.UseSqlServer(connectionstring);

using(DbContext dbContext = new DbContext(optionsBuilder.Options))
{
          var unitOfWork=new UnitOfWork(dbContext)  
        var customClass =new CustomClass (unitOfWork);
       .....

    }
}
}