簡體   English   中英

具有依賴項注入的 EF 核心 DbContext

[英]EF core DbContext with dependency injection

我創建了一個可注入的 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);

    }
}

首先,將你的代碼從ConfigureServices移到一些可以被 Web 和控制台項目使用的共享庫中。 創建擴展方法來配置您的所有服務。

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

您可以做的只是將您的類添加到依賴注入容器並將其注入到您的構造函數中,您不需要在控制器中注入 IUnitOfWork。

services.AddScoped<CustomClass>();

然后在您的控制器構造函數中

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

之后你就可以在你的類方法中使用這個類

我會嘗試這樣的事情:

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);
       .....

    }
}
}

暫無
暫無

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

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