3

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

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

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

我的问题是:

  1. 我是否可能创建了太多存储库 - 通常,我将 1 个存储库映射到 1 个实体类到 1 个数据库表。我的存储库是否应该有效地包含一个以上的实体/数据库表?
  2. 我是否错过了 IoC 和依赖注入的要点,我是否应该不关心参数如何传递给 Controller 构造函数?

给出某种背景。该网站的一部分将显示一个可按属性类型(城堡、房屋、酒吧等)、位置(邮政编码、城市)、开放时间等搜索的属性的谷歌地图。因此,这些可搜索的组件都是独立的实体属性类型、地址。城市、地址.邮政编码.经纬度+经度、开放时间.日期时间。因此,还有 3 个单独的存储库必须传递到 SearchController 构造函数中。

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

希望这一切都有意义。

感谢您的任何答案或建议。

4

1 回答 1

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
}
于 2009-05-16T14:22:50.883 回答