asp.net mvc3,为什么我需要为我的控制器类构造

时间:2012-05-17 18:52:35

标签: asp.net asp.net-mvc-3 inversion-of-control

我正在学习asp.net mvc3。我在网上找到的一个例子是告诉我如何使用IOC。

            public class HomeController : Controller
            {
                private IHelloService _service;
                public HomeController():this(new HelloService())
                {}

                public HomeController(IHelloService service)
                {
                    _service = service;
                }
            }

此示例中有两个构造函数。我理解第二个。第一个,我明白这是为了什么,但对我来说,它似乎是额外的代码,你永远不会需要它。

有人可以向我解释是否要添加第一个构造函数。

                public HomeController():this(new HelloService())
                {}

2 个答案:

答案 0 :(得分:4)

当MVC框架实例化控制器时,它使用默认(无参数)构造函数。

默认情况下,您正在注入具体的IHelloService实现。这将在用户导航到操作时使用。

单元测试将使用重载并传入模拟IHelloService实现,而不是调用默认构造函数。

答案 1 :(得分:3)

如果您不使用为您注入此内容的依赖项注入框架,那么它将非常有用。通过这种方式,您无需手动注入对象,对象将自行处理。

当然,第二个构造函数在单元测试时注入自定义对象很有用。

通常需要这样做:

IFoo foo = new Foo();
IBar bar = new Bar(foo);

当构造函数创建默认对象时,您可以这样做:

IBar bar = new Bar();

Bar将创建一个Foo并将其注入其自身。