我正在阅读这篇网址 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]
属性,那么我们可以从第一个相同的代码中消除哪些代码行。感谢
答案 0 :(得分:12)
两个代码块之间的差异确实是第一个利用构造函数注入来解析对TimeService
的依赖,而第二个示例将属性标记为需要使用属性注入进行解析的属性。
这意味着以下构造函数变得多余:
public HomeController(TimeService timeService)
{
TimeService = timeService;
}
至于为什么会选择构造函数与Property Injection,我发现尝试在构造函数中清楚地列出您的依赖项列表时会突出显示某个类过于依赖,这引起了对类正在尝试的问题的关注完成并随后使其成为重构的候选者。
从beta5开始通过[Activate]
will not be supported进行房产注入。