gpt4 book ai didi

asp.net-mvc - MVC 项目之外的 DbContext 依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 15:53:57 25 4
gpt4 key购买 nike

我有一个 C# 解决方案,其中包含两个项目 ProductStore.Web 和 ProductStore.Data,它们都针对 .NET Core 2.0。

我的 HomeController 和 CustomerRepository 如下(我已经在 HomeController 中设置它以提高速度,客户创建将在客户 Controller 中,但还没有脚手架):

namespace ProductStore.Web.Controllers
{
public class HomeController : Controller
{
private readonly DatabaseContext _context;

public HomeController(DatabaseContext context)
{
_context = context;
}
public IActionResult Index()
{
ICustomerRepository<Customer> cr = new CustomerRepository(_context);
Customer customer = new Customer
{
// customer details
};
//_context.Customers.Add(customer);
int result = cr.Create(customer).Result;
return View();
}
}
}

namespace ProductStore.Data
{
public class CustomerRepository : ICustomerRepository<Customer>
{
DatabaseContext _context;
public CustomerRepository(DatabaseContext context)
{
_context = context;
}
}
}

依赖注入(inject)在 Controller 内部自动解析_context。然后,我将上下文作为驻留在 ProductStore.Data 中的 CustomerRepository 的参数传递。

我的问题有两个:

  1. 这是最佳实践吗(将上下文从 Controller 传递到 CustomerRepository)
  2. 如果不是最佳实践,我是否可以通过 IServiceCollection 服务 访问上下文,其方式类似于将 DatabaseContext 插入到我的应用程序 StartUp.cs 类中的服务中...

我觉得我不应该传递上下文,CustomerRepository 应该负责获取上下文。

仅供引用,对于 MVC 来说相对较新,对于 Entity Framework 和依赖注入(inject)来说是全新的

谢谢

最佳答案

您无需通过contextcontroller能够使用context在存储库内的服务中注册。我喜欢这样做的方式如下。注入(inject) context进入 repository然后注入(inject)repository进入 Controller 。在 .Net Core 中使用 Microsoft Dependency Injection Extension,它看起来像这样

// Service registrations in Startup class
public void ConfigureServices(IServiceCollection services)
{
// Also other service registrations
services.AddMvc();
services.AddScoped<DatabaseContext, DatabaseContext>();
services.AddScoped<ICustomerRepository<Customer>, CustomerRepository>();
}

// Controller
namespace ProductStore.Web.Controllers
{
public class HomeController : Controller
{
private readonly ICustomerRepository _customerRepository;

public HomeController(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
public IActionResult Index()
{
Customer customer = new Customer
{
// customer details
};
//_context.Customers.Add(customer);
int result = _customerRepository.Create(customer).Result;
return View();
}
}
}

//Repository
namespace ProductStore.Data
{
public class CustomerRepository : ICustomerRepository<Customer>
{
DatabaseContext _context;
public CustomerRepository(DatabaseContext context)
{
_context = context;
}
}
}

之后当DependencyResolver试图解决ICustomerRepository注入(inject)HomeController他看到,ICustomerRepository 的注册实现(在我们的例子中 CustomerRepository )有一个需要 DatabaseContext 的构造函数作为参数和DependencyResolver试图获得 DatabaseContext 的注册服务并将其注入(inject) CustomerRepository

关于asp.net-mvc - MVC 项目之外的 DbContext 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46554107/

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