0

我对IoC相当陌生,并且对未来的最佳实践有点卡住。我正在开发的项目是在夏普体系结构的MVC中构建的。我们目前使用IoC的方式是在每个控制器的构造函数中指定存储库接口,并让Castle Windsor完成其余的工作并将这些实例传递给每个模型。然而,由于控制器可能会实例化许多新模型,而这些新模型又会调用其他模型等,所以它可能很容易失控,并且一些控制器现在在构造器参数中有20多个存储库接口。在温莎城堡/夏普体系结构中处理许多存储库

由于每个控制器都继承了一个BaseController,我正在考虑创建一个存储库,这只是一个存储库列表,它带有一个返回类型T的存储库的Get()方法,并且可以在基本控制器中实例化/填充并且只是传入每个模型中,那么我们就不必担心所有传递的存储库。

然而,这感觉错了一些如何,我不禁感到温莎城堡应该做这样的事情,但不知道如何。

很想听听你对此的想法。

谢谢。

+0

感觉你的控制器需要承担很多责任,如果你不得不将20多个存储库注入其中任何一个或我缺少什么东西?夏普架构还引入了应用程序服务模式,它可以让你将一些逻辑分成更小的部分。 – 2011-03-21 14:38:30

+0

我同意它的确如此,但系统的不同部分有很多依赖关系。这些存储库实际上并未在控制器中使用,它们就在那里,因此可以实例化一个模型,并且该模型可以实例化其他模型。我们尽力使事情尽可能脱离联系,但系统的性质使这变得困难。如果我从头开始,我可能会以不同的方式做,虽然我不太清楚如何... – Ben 2011-03-21 14:43:40

+0

也有你的应用程序服务模式的任何资源,因为Google几乎没有任何显示(http://www.google .co.uk/search?q =%22Application + Service + pattern%22 + s%23arp + architecture) – Ben 2011-03-21 14:51:28

回答

1

存储库的存储库,听起来像工作单元模式。你可以做的是注入一个IUnitOfWorkFactory,它允许你创建新的IUnitOfWork实例。一个工作单元实例,而不是所有的存储库。

寻找这样的实施例here。个人而言,我不会注入存储库甚至工作单元实例到控制器中,而是将一个服务注入到控制器中。该服务将使工作单元或存储库成为依赖关系。

+0

我同意问题评论中所述的“注入服务而不是存储库”。 – 2011-03-21 16:06:48

+0

目前我们有一个非常大的系统,基本上没有服务层。我不禁感到,至少对我们来说,这只会增加另一层复杂性,没有太多收获。这可能只是因为我并不真正了解这些好处,或一般的模式。你知道这种模式的好例子吗?最好显示控制器,模型和存储库如何交互。谢谢 – Ben 2011-03-21 16:16:24

+0

@Ben:控制器是为了控制视图,而不是用于做生意的东西。你的控制器可能做得太多了,你没有遵循单一责任原则(SRP)。如果你有一个“非常大的系统”,你肯定会从SRP中受益。我们添加抽象层来控制复杂性。添加应用程序服务不是那么抽象。这实际上很简单,因为@MikeEast已经与评论中的一个链接。然而,我链接到的'IUnitOfWorkFactory'的例子实际上更加抽象。 – Steven 2011-03-21 16:32:47