【问题标题】:Does Microsoft DependencyInjection support non-constructor injection?Microsoft DependencyInjection 是否支持非构造函数注入?
【发布时间】:2017-06-27 01:24:54
【问题描述】:

我正在尝试将Microsoft.Extensions.DependencyInjection 合并到一个现有 ASP.NET 4.6.1 应用程序中。

我知道虽然 .NET Core 内置了它,但对于 4.6.1,您需要创建一些初始类,如 http://scottdorman.github.io/2016/03/17/integrating-asp.net-core-dependency-injection-in-mvc-4/ 中所述。 (这篇文章似乎已经过时了,因为示例代码没有显示IDependencyResolverBeginScope()Dispose() 的实现。如果有人有更多更新的示例,将不胜感激。)

您通过 constructors 创建实例的控制器访问的“服务”相当简单,但我的问题是当我需要来自现有对象的属性或方法的“某物”实例时.

例如,我有一个继承的DbContext,它需要一个来自登录用户的 System.Security.Principal.IIdentity 实例。

另一个例子是ApplicationUser 的实例。 ApplicationUser继承IdentityUser,可以通过调用AppUserManagerFindById()方法找到当前用户。

虽然AppUserManager 可以使用 DI 轻松实例化,但如何使用 DI 注入 FindById() 方法的输出?对于基于 Microsoft 的框架,我似乎找不到任何关于此的文档或示例代码。 Unity 等其他框架似乎支持基于属性的注入。

本质上,DI 是否可以与所有现有类一起使用,或者您是否特别需要编写类以从一开始就支持 DI? (即只期望通过构造函数传入参数,并确保这些实例本身是通过构造函数创建的)。

【问题讨论】:

  • how can I use DI the inject the output of the FindById() method? - 你不应该。这是运行时数据,“注入”它的最简单方法是让它作为参数通过服务方法。如果你希望它在不传递的情况下被“知道”,你可以注入一个工厂来在你的每个方法中检索它。

标签: dependency-injection .net-4.6.1


【解决方案1】:

对您的问题“Microsoft DependencyInjection 是否支持非构造函数注入?”的非常简单而简短的回答。是,没有。

开箱即用的 Microsoft DI 目前不像其他框架(如 Ninject)那样支持属性注入。如果您需要该功能,我建议改用这些框架(我无法想象 MS 有任何计划在短期内添加属性注入)。

您的另一个选择是考虑如何重构代码以使用构造函数注入代替这是首选方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多