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

我正在阅读这篇url http://weblogs.asp.net/scottgu/introducing-asp-net-5中关于ASP.Net MVC 6中轻松依赖注入的文章

它们表明我们可以非常轻松地将依赖项注入到项目中

一个

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的依赖,而第二个示例将属性标记为需要使用Property Injection解析的属性.

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

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

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

从beta5开始通过[Activate] will not be supported进行物业注入.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...