ASP.Net MVC:使用多个存储库&由Unity DI注射

时间:2018-02-15 13:40:54

标签: asp.net-mvc dependency-injection unity-container

我正在使用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注入。

请给我最好的指导。感谢

2 个答案:

答案 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 examplesStack 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();
     }  
}