问题描述
我有一个 C# 解决方案,其中包含两个项目 ProductStore.Web 和 ProductStore.Data,它们都针对 .NET Core 2.0.
I have a C# solution with two projects, ProductStore.Web and ProductStore.Data, both targeting .NET Core 2.0.
我的 HomeController 和 CustomerRepository 如下(我已经在 HomeController 中设置它以提高速度,客户创建将在客户控制器中,但还没有脚手架):
I have my HomeController and CustomerRepository as follows (I've set it up in the HomeController for speed, customer creation will be in the customer controller, but not yet scaffold-ed it out):
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;
}
}
}
依赖注入在控制器内部自动解析_context.然后,我将上下文作为驻留在 ProductStore.Data 中的 CustomerRepository 的参数传递.
Dependency Injection resolves _context automatically inside the controller. I am then passing the context as a parameter for CustomerRepository which resides in ProductStore.Data.
我的问题有两个:
- 这是最佳实践吗(将上下文从控制器传递到 CustomerRepository)
- 如果不是最佳实践,我是否可以通过
IServiceCollection 服务
访问上下文,其方式类似于将 DatabaseContext 插入到我的应用程序 StartUp.cs 类中的服务中...
- Is this best practice (passing the context from controller to CustomerRepository)
- If not best practice, can I access context via
IServiceCollection services
in a similar way to how the DatabaseContext is inserted into services in my application StartUp.cs class...
我觉得我不应该传递上下文,CustomerRepository 应该负责获取上下文.
I feel like I shouldn't have to pass the context over, CustomerRepository should be responsible for acquiring the context.
仅供参考,对于 MVC 来说相对较新,对于实体框架和依赖注入来说是全新的
FYI, relatively new to MVC and brand new to Entity Framework and Dependency Injection
谢谢
推荐答案
您无需将 context
传递给 controller
即可使用 在存储库内的服务中注册的上下文
.我喜欢这样做的方式如下.将 context
注入 repository
,然后将 repository
注入控制器.在 .Net Core 中使用 Microsoft Dependency Injection Extension,它看起来像这样
You don't need to pass context
to controller
to be able to use the context
registered in services inside repository. The way I prefer to do that, is the following. Inject context
into repository
and then inject repository
into controller. Using the Microsoft Dependency Injection Extension in for .Net Core it will look like this
// 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
以注入他看到的 HomeController
时,ICustomerRepository(在我们的例子中是
CustomerRepository
)有一个构造函数,它需要 DatabaseContext
作为参数并且 DependencyResolver
试图为 DatabaseContext
并将其注入 CustomerRepository
After this when DependencyResolver
tries to resolve ICustomerRepository
to inject into the HomeController
he sees, that the registered implementation of ICustomerRepository
(in our case CustomerRepository
) has one constructor which needs DatabaseContext
as a parameter and DependencyResolver
trying to to get registered service for DatabaseContext
and inject it into CustomerRepository
这篇关于MVC 项目之外的 DbContext 依赖注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!