IoC会导致ASP.NET MVC Controller构造函数的参数太多吗?

时间:2009-05-16 14:10:10

标签: asp.net-mvc inversion-of-control controller castle-windsor

我决定将 ASP.NET MVC 用于网站项目,并希望遵循一些最佳实践。

因此,我已将域/模型分离为一个单独的项目,创建了IRepositories和具体的存储库,现在我将注意力转移到 Castle Windsor 作为 IoC

我现在面临的问题是,对于特定的Controller,在构造函数上,我现在必须传入多个IRepository参数。

我的问题是:

  1. 我是否创建了太多的存储库 - 通常,我将1个存储库映射到1个实体类到1个数据库表。我的存储库是否应该有效地包含多个实体/ db表?
  2. 我是否错过了IoC和依赖注入的重点,我是否应该关注如何将params传递给Controller构造函数?
  3. 给出某种背景。该网站的一部分将显示可通过属性类型(城堡,住宅,酒吧等),位置(邮政编码,城市),搜索的属性的谷歌地图开放时间等 因此,这些可搜索的组件都是独立的实体PropertyType,Address.City,Address.Postcode.Lat + Long,OpeningTime.DateTime。因此,还有3个单独的存储库必须传递给SearchController构造函数。

    这是一个简单的例子,但我可以设想将来会有更多的存储库参数传递给其他控制器。

    希望这一切都有意义。

    感谢您提供任何答案或建议。

1 个答案:

答案 0 :(得分:3)

我不关心你传递给构造函数的参数有多少,IoC将处理所有逻辑。

如果您的控制器最终有太多参数,我会考虑分解控制器的功能,或者将逻辑移到服务类中。

对于存储库,我通常使用通用存储库,它将在其实现中使用单个实体。然后我有一个服务类,将该信息聚合成逻辑单元。在这种情况下,您的控制器只需要访问该服务。例如:

interface IRepository<T>
{
    IQueryable<T> GetAll();
    T GetOne(int id);
    void Save(T item);
    void Delete(T item);
}

class OrderService
{
    public OrderService(IReopository<Order> orderRepository, IRepository<OrderDetail> orderDetailRepository, IRepository<Payment> paymentRepository, etc) { }

    public Order CreateOrder(List<OrderDetails> details)
    {}
    // .. other aggregate methods
}