ASP.Net MVC 6中的依赖注入(DI)

6
我在阅读这个网址上有关ASP.Net MVC 6轻松进行依赖注入的文章:http://weblogs.asp.net/scottgu/introducing-asp-net-5
他们展示了如何非常容易地将依赖注入到项目中。
namespace WebApplication1
{
    public class TimeService
    {
        public TimeService()
        {
            Ticks = DateTime.Now.Ticks.ToString();
        }
        public String Ticks { get; set; }
    }
}


register the time service as a transient service in the ConfigureServices method of the Startup class:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddTransient<TimeService>();
    }


public class HomeController : Controller
{

    public TimeService TimeService { get; set; }

    public HomeController(TimeService timeService)
    {
        TimeService = timeService;
    }


    public IActionResult About()
    {
        ViewBag.Message = TimeService.Ticks + " From Controller";
        System.Threading.Thread.Sleep(1);
        return View();
    }
}

第二个

public class HomeController : Controller
{
    [Activate]
    public TimeService TimeService { get; set; }
}

现在看一下第二段代码,他们是不是想说如果我们使用[Activate]属性,那么我们就不需要通过控制器构造函数注入来实例化TimeService了?

请告诉我如果我们使用[Activate]属性,那么有什么优势?

如果我们使用[Activate]属性,那么第一段相同代码中可以省略哪些行代码。谢谢

1个回答

12

这两个代码块的区别在于第一个代码块利用了构造函数注入来解决对TimeService的依赖,而第二个示例将属性标记为需要使用属性注入来解析。

这意味着以下构造函数变得多余:

public HomeController(TimeService timeService)
{
    TimeService = timeService;
}

为什么要选择构造函数注入而不是属性注入,我发现将依赖项列表清晰地列在构造函数中可以凸显出一个类过度依赖的问题,这引起了对该类尝试实现什么功能以及随后需要进行重构的担忧。

从beta5开始,通过[Activate]进行属性注入将不再受到支持


1
正如我所说,将注入保留在构造函数中有助于识别代码异味。这也确保了您的对象在初始化时具有其需要的所有依赖项以正常运行。此时没有任何歧义,您要么满足依赖关系,要么您的类将根本无法实例化。如果您搜索“Constructor vs Setter Injection”,则会有大量相关资源可供参考。 - Yannick Meeus
2
注意:在控制器中通过 [Activate] 进行属性注入,还可以让您获取一些未在 DI 中出现的特定项,例如 ActionContextHttpContextHttpRequestHttpResponseViewDataDictionaryActionBindingContext。当您不再从 Controller 类继承并使用 poco 控制器时,这些变得更加有价值。 - N. Taylor Mullen
@N. Taylor Mullen。这是一个很好的观点,值得提出。 - Yannick Meeus
属性注入使用 [Activate] 属性只能在控制器中使用吗? - Breakskater
只要可以由IOC容器管理并且属性是公开可访问的,它就适用于每个类(我认为有一些框架可以处理私有属性,但那会变得非常丑陋)。 - Yannick Meeus
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接