3

我决定使用ASP.NET MVC为一个网站项目,并希望遵循正在编写的一些最佳实践。IoC会导致ASP.NET MVC Controller构造函数的参数太多吗?

所以,我已经分离出的域/型号为一个单独的项目,创建IRepositories和具体的资料库和现在已经把我的注意温莎城堡的IoC

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

我的问题是:

  1. 我有没有可能创造太多的存储库 - 总的来说,我映射1存储库1的实体类为1的数据库表。我的存储库是否应该有效地包含多个实体/数据库表?
  2. 我是否错过了IoC和依赖注入的观点,我应该不关心params如何传递给Controller构造函数?

给出某种上下文。该网站的部分将展示性质的谷歌地图是由属性类型(城堡,房子,酒吧等),位置(邮编,市),开标时间等 因此,这些搜索组件搜索所有单独的实体PropertyType,Address.City,Address.Postcode.Lat + Long,OpeningTime.DateTime。因此,还有3个独立的存储库必须传递给SearchController构造函数。

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

希望这一切都有道理。

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

回答

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 
} 
+0

感谢您的回答。 2请遵循以下问题: 1)当你说不关心控制器构造函数中的参数个数时 - 我仍然需要实际编写构造函数,尽管是这样吗? IoC不会幕后为实际构造者创建代码会不会呢? 2)据推测,由于Service类仅包含接口,因此将其作为类传递到Controller而不是接口(IOrderService)是可以的,并且仍然允许分离关注点并允许轻松测试?再次感谢 – 2009-05-18 09:22:06

+0

1)是的,你仍然需要设置完全加载的构造函数。 2)您的容器将处理加载接口时要使用的类实例。看到最近的这个问题,我写了两个可能有用的答案。 http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code – bendewey 2009-05-18 11:59:38

相关问题