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

Mou*_*Mou 6 c# asp.net-mvc dependency-injection asp.net-core-mvc

我正在阅读这篇网址中关于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();
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个

public class HomeController : Controller
{
    [Activate]
    public TimeService TimeService { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在看第二个代码.他们试图说,如果我们使用[Activate]属性,那么我们不必TimeService通过控制器构造函数注入实例化?

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

如果我们使用[Activate]属性,那么我们可以从第一个相同的代码中消除哪些代码行.谢谢

Yan*_*eus 12

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

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

public HomeController(TimeService timeService)
{
    TimeService = timeService;
}
Run Code Online (Sandbox Code Playgroud)

至于为什么会选择构造函数与属性注入,我发现尝试在构造函数中清楚地列出你的依赖项列表会突出显示一个类过于依赖,这引起了对类正在尝试完成的内容的关注. ,随后,使其成为重构的候选人.

从beta5开始[Activate] 不支持 Property Injection via .

  • **注意:**通过控制器中的[Activate]进行属性注入,还可以提取DI中不存在的一些选项,例如`ActionContext`,`HttpContext`,`HttpRequest`,`HttpResponse`,` ViewDataDictionary`和`ActionBindingContext`.当你不再继承`Controller`类并使用poco控制器时,这些变得更有价值. (2认同)