MVC 3:将多个存储库注入单个控制器

时间:2011-08-16 15:12:28

标签: asp.net-mvc-3 architecture controller repository inversion-of-control

我的表示层位于MVC 3中。

我有一个返回存储库的数据访问层。每个存储库都映射到一个表。

例如,我有以下存储库接口:

  • ICustomerRepository
  • ICustomerTypeRepository

我有这些存储库的实体框架实现。这些实现在Ninject的运行时注入。

我有两个控制器:

  • CustomerController
  • CustomerTypeController

每个控制器都有一组CRUD例程。客户必须拥有类型。

为了创建客户记录,我需要使用EFCustomerTypeRepository。

我现在在CustomerController中有一个构造函数,它看起来像这样:

public class CustomerController: Controller
{
   private ICustomerRepository customerRepository;        
   private ICustomerTypeRepository customerTypeRepository; 

   public CustomerController(ICustomerRepository customerRepository, 
                             ICustomerTypeRepository customerTypeRepository)
   {
      this.customerRepository = customerRepository;            
      this.customerTypeRepository = customerTypeRepository;
   }     

...

开发处于早期阶段,如果我采用这种方法,那么在接下来的几天内,这个构造函数将有5个或更多参数。这看起来不对。

我可以将所有这些逻辑存储在EFCustomerRepository中,但是,这将打破单一责任原则。所以我不打算这样做。

最后,我可以包装这些存储库并将一个RepositoryWrapper类型对象传递给我的控制器。

我不想介绍任何比我更多的框架和工具。我的目标是实现松散耦合和易扩展性,但目前我在将更多参数传递给构造函数或为存储库编写包装器之间陷入困境。

我正在使用MVC 3,EF 4.1,Ninject,Moq和Automapper。谢谢

2 个答案:

答案 0 :(得分:2)

我想说你必须在代码中观察聚合(从Domain Driven Design的角度来看)。因此,如果你可以让一个类封装了许多其他类,这些类本身就没有用,那么你可以创建一个漂亮的对象图并只有一个ICustomerRepository来封装内部引用,例如客户类型。

答案 1 :(得分:0)

无论如何,将多个存储库注入控制器构造函数并不一定是不好的做法。它被称为“构造函数过度注入”,请参阅Mark Seemann关于此主题的书。