在 ASP.NET 核心中使用时,如何从另一个项目访问 EF 核心的 DbContext?



我遵循模式将EF Core与 ASP.NET 核心一起使用,一切都很好。但是最近我创建了一个"计算"项目,并希望从中进行数据库调用。

问题是我不知道如何创建一个新DbContextOptions.在我的代码中,这是完成的

services.AddDbContext<RetContext>(options => options
.UseLazyLoadingProxies()
.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

但是在一个新的 .NET 核心类中,我需要手动提供它。我该怎么做?我的代码是这样的:

public static class LoadData
{
public static IConfiguration Configuration { get; }
public static RefProgramProfileData Load_RefProgramProfileData(string code)
{
// var optionsBuilder = new DbContextOptionsBuilder<RetContext>();
// optionsBuilder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
//How do I make an optionsbuilder and get the configuration from the WEB project?
UnitOfWork uow = new UnitOfWork(new RetContext(optionsBuilder));

var loadedRefProgramProfileData  = uow.RefProgramProfileDataRepository
.Find(x => x.ProgramCode == code).FirstOrDefault();
return loadedRefProgramProfileData;
}
}

您可以像这样实例化您的DbContext

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
var configuration = builder.Build();
var optionsBuilder = new DbContextOptionsBuilder<RetContext>();
optionsBuilder.UseSqlServer(configuration.GetConnection("DefaultConnection"));
_context = new RetContext(optionsBuilder.Options); 

但是,理想的情况是使用依赖注入。假设您在另一个项目中有一个类CalculationService。为此,您需要将该类注册为可以注入的服务:

services.AddScoped<CalculationService>();

然后,您的班级可以通过 DI 接收DbContext(或任何其他服务(:

public class CalculationService
{
private RetContext _context;
public CalculationService(RetContext context)
{
_context = context;
}
}

当然,您将无法像这样手动实例化您的类:

var service = new CalculationService();

相反,您需要使任何类需要使用您的CalculationService也通过 DI 接收它并使该类也可注入。

最新更新