我正在使用structuremap作为IOC容器进行MVC项目。我们正在进行TDD,我想设置我的依赖项,以便它易于使用,并且易于测试。
我应该如何最好地为下面虚构的插图图设置依赖关系图?
您是否在控制器上注入了userrepository,并进一步从身份验证服务中注入?如果图表更深入怎么办?你不会从控制器上获得很多依赖吗?
如果您对applicationcontroller有依赖关系,那么您是否也将它注入到控制器上,然后在基础上注入?
如果我让容器解析图中间某处的实例,我将不得不设置容器进行测试?这是好事还是最好避免?
还有另一种方式,我没有看到吗?
答案 0 :(得分:5)
你的依赖图看起来很好。如图所示,每个类只有一个依赖
我意识到这是一个简化的视图,并且您的真实生产架构会复杂得多,但DI(以及 Constructor Injection )的优点在于它违反了Single Responsibility Principle如此明显。
一个班级开始得到太多的依赖关系,这表明你应该refactor to an Aggregate Service。
最终的依赖图可能是 huge ,但每个类只依赖于一些抽象,所以从架构的角度来看,这不是问题。
您永远不必在图表中间解析实例。解析是你do in the Composition Root和(理论上)只有一次。
答案 1 :(得分:0)
不确定您的applicationController与您的控制器的关系,但一般情况下,您的控制器将依赖您的服务,您的服务将依赖于存储库。
e.g。
public MyXyzController
{
public MyXyzController(IAuthenticationService authenticationService){...}
}
public class AuthenticationService : IAuthenticationService
{
public AuthenticationService(IUserRepository userRepository){...}
}
这样,当您请求(即解析)控制器时,您的IOC容器将自动解析所有依赖关系。