我正在使用asp.net mvc 5项目。假设我正在显示客户数据,其中显示客户详细信息和客户喜爱的产品。
所以我从客户存储库,国家/地区存储库和最喜欢的存储库中获取数据。
很多时候人们通过统一DI写关于注入存储库的文章。当我使用单一存储库时,这个概念是有意义的,但是当我必须从多个存储库获取数据时,我怎样才能在mvc控制器ctor中通过unity di注入多个存储库?
请参阅统一DI注入存储库的小代码。
public class FooController : Controller
{
readonly IFooRepository _repository;
// Inject here
public ProductController(IFooRepository repository)
{
_repository = repository;
}
// Use it here
public ActionResult Bar()
{
var bar = _repository.DoSomething();
}
}
上面的代码来自https://forums.asp.net/t/2105895.aspx?Repository+inject+into+controller+by+Unity+DI
现在告诉我如何重构我的代码或我应该遵循什么方法,因此我可以使用多个存储库,也可以通过Unity DI注入。
请给我最好的指导。感谢
答案 0 :(得分:1)
只需将您需要的任何依赖项添加到控制器的构造函数中。
public class FooController : Controller
{
readonly IFooRepository _repository;
readonly IOtherRepository _otherRepository;
public ProductController(IFooRepository repository, IOtherRepository otherRepository)
{
_repository = repository;
_otherRepository = otherRepository;
}
答案 1 :(得分:0)
请注意,虽然 L-Four response通常是一种很好的方法,但是当你对加载的实体进行一些修改时,可能会遇到困难并希望保存它们,因为您可能最终在您的存储库中有单独的DBContext
个实例。但这取决于您的存储库和DI实施和配置......
示例:
// Assume you want to create a new User with associated Account
var user = _usersRepository.AddUser(new User(....));
var account = _accountRepository.AddAccount(new Account{ ... User = user });
// Now you want to save them both in one transaction... how?
_usersRepository.Commit();
_accountRepository.Commit(); // What if this fails? you have an orphaned user?
要解决此问题,我建议您实施所谓的工作单元模式。 good examples和Stack Overflow上还有一些elsewhere。
以后可能会让你头疼。
您的更新代码将是:
public class FooController : Controller
{
readonly IUsersAndAccountUnitOfWork _uow;
// Inject here
public ProductController(IUsersAndAccountUnitOfWork uow)
{
_uow = uow;
}
// Use it here
public ActionResult Bar()
{
var user = _uow.Users.AddUser(new User(....));
var account = _uow.Accounts.AddAccount(new Account{ ... User = user });
_uow.Commit();
}
}