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

Dependency injection (DI) in ASP.Net MVC 6

我正在阅读一篇关于 ASP.Net MVC 6 中的简单依赖注入的文章 url 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] 属性,那么我们可以从第一个相同的代码中删除哪一行代码。谢谢

两个代码块之间的区别确实是第一个利用构造函数注入来解决对 TimeService 的依赖,而第二个示例将 属性 标记为需要使用 属性 注入.

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

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

至于为什么人们会选择构造函数而不是 属性 注入,我发现当 class 变得过于依赖时,尝试在构造函数中清楚地列出您的依赖项列表会突出显示,这引起了人们对 class 试图完成什么的担忧,并随后使其成为重构的候选对象。

属性 从 beta5 开始通过 [Activate] will not be supported 注入。