【问题标题】:Dependency injection (DI) in ASP.Net MVC 6ASP.Net MVC 6 中的依赖注入 (DI)
【发布时间】:2015-02-24 13:08:30
【问题描述】:

我正在从这个 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] 属性,那么我们可以从第一个相同的代码中删除哪一行代码。谢谢

【问题讨论】:

    标签: c# asp.net-mvc dependency-injection asp.net-core-mvc


    【解决方案1】:

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

    这意味着下面的构造函数变得多余了:

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

    至于为什么要选择构造函数与属性注入,我发现尝试在构造函数中清楚列出依赖项列表会突出显示类变得过于依赖时,这会引起对类尝试的关注完成并随后使其成为重构的候选者。

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

    【讨论】:

    • 感谢您的回答。你能告诉我人们何时选择构造函数注入以及何时选择属性注入?哪个好?
    • 正如我所说,将注入保留在构造函数中有助于识别代码异味。它还确保您的对象在初始化时具有正常运行所需的所有依赖项。在这一点上没有歧义,要么你满足依赖,要么你的类根本不会实例化。关于这件事有很多资源,如果你谷歌“Constructor vs Setter Injection”,你会发现很多。
    • 抱歉不是很清楚。您是否尝试构造函数注入比属性注入更好?
    • 在几乎所有情况下,我都会说是
    • 注意: 通过控制器中的 [Activate] 进行属性注入还使您能够提取 DI 中不存在的一些选定项,例如 ActionContext、@987654326 @、HttpRequestHttpResponseViewDataDictionaryActionBindingContext。当您不再继承 Controller 类并使用 poco 控制器时,这些变得更有价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多