gpt4 book ai didi

c# - 在同一个 Asp.Net Core 2 解决方案中将 DbContext 注入(inject)类库项目

转载 作者:行者123 更新时间:2023-11-30 12:21:04 25 4
gpt4 key购买 nike

过去相对容易的事情,现在变得不那么容易了。在我搜索的几十次中,我很少找到这种情况的答案,我不敢相信除了在大多数项目结构中普遍存在之外还有什么。

我有标准的 Core 2.0 Web 应用程序,为了简单起见,现在有一个基础设施项目和一个单元测试项目。我很清楚如何完成测试场景,因为测试项目不运行 asp.net,而且我有一个关于如何完成它的很棒的视频教程。

问题在于在我的基础设施项目中访问 DbContext。 (.Net Core类库)

DbContext 在 Startup 中设置得很好

var connString = Configuration.GetSection("ApplicationConfiguration:ConnectionStrings:DefaultConnection").Value;
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connString));

在 Controller 中我可以访问它

private ApplicationDbContext _context;
private IConfiguration Configuration { get; set; }

public HomeController(IConfiguration configuration, ApplicationDbContext context)
{
_context = context;
Configuration = configuration;
}

public IActionResult Index()
{
// gets users from the DI injected context in the controller
var users = _context.AppUsers.ToList();

// if GetUsers is defined statically, this doesn't work because the injected context is always null
//var diUsers = DatabaseService.GetUsers():

// making it non-static and newing it up works, but defeats the purpose because you are passing the context, asp.net is not injecting it
var ds = new DatabaseService(_context);
var diUsers = ds.GetUsers();

var svm = SettingsViewModel();

return View(svm);
}

数据库服务

private ApplicationDbContext _context;
//this is the constructor for DatabaseService class
public DatabaseService(ApplicationDbContext context)
{
_context = context;
}

public List<ApplicationUser> GetUsers()
{
var users = _context.AppUsers.ToList();
return users;
}

是的,我知道我应该使用一个存储库,一旦我正确地弄清楚了它,我就会使用。我如何在基础设施项目中设置我的类,以便在启动时创建注入(inject)的 DbContext 而不必将其作为参数传递。

附录:

使用 Nkosi 提供的答案,我可以在 Controller 中注入(inject)数据服务并使用它。

但是如果我有一个单独的基础设施项目(Asp.net core 2 类库),它实现了我的存储库和 UoW

 public class GenericRepository<T> : IRepository<T> where T : class
{
public GenericRepository()
{

}
//rest of code removed
}

我怎样才能在那里注入(inject) DbContext?我是否需要创建一个接口(interface) IDbContext 来包装 DbContext,并在启动时注册它?

最佳答案

假设您有以下服务

public interface IDatabaseService {
List<ApplicationUser> GetUsers();
//...
}

public class DatabaseService : IDatabaseService {

public DatabaseService(ApplicationDbContext context) {
//...code removed for brevity
}

//...code removed for brevity
}

该服务明确依赖于 ApplicationDbContext,当从服务容器解析实现时,它将被注入(inject)。

Startup.ConfigureServices中注册服务

var connString = Configuration.GetSection("ApplicationConfiguration:ConnectionStrings:DefaultConnection").Value;
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connString));
services.AddScoped<IDatabaseService, DatabaseService>();

并重构 Controller 以明确依赖于服务

private IDatabaseService ds;
private IConfiguration Configuration { get; set; }

public HomeController(IConfiguration configuration, IDatabaseService ds) {
this.ds = ds;
Configuration = configuration;
}

public IActionResult Index() {
var diUsers = ds.GetUsers();

var svm = SettingsViewModel();

return View(svm);
}

关于c# - 在同一个 Asp.Net Core 2 解决方案中将 DbContext 注入(inject)类库项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47643913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com