构造函数中上下文类的依赖注入

Posted

技术标签:

【中文标题】构造函数中上下文类的依赖注入【英文标题】:Dependency injection of context class in constructor 【发布时间】:2016-05-28 13:53:18 【问题描述】:

我有一个使用ApplicationContext 的服务。所以我想使用依赖注入让应用程序给我上下文。所以我投入建设

Private _context;

// Constructor
public Service(ApplicationContext context) 
    _context = context

问题是当我初始化这个服务时,我必须向它传递一个上下文,所以这不是真正的依赖注入,是吗?

有没有办法在不将其放入构造函数参数的情况下注入上下文?

****** 编辑 *****

很抱歉,我第一次没有提供足够的信息。让我试着更好地解释一下。我有一项服务,我现在只调用服务。它读取请求中的标头变量并根据它们的值返回 xml。我在控制器的每种不同方法中新建一个实例,因为它们可能具有不同的标头变量值。我希望将上下文注入服务而不是控制器,所以我可以这样说:

Service service = new Service(Request);

而不是这个:

Service service = new Service(Request, Context);

服务的原因是在控制器不需要知道任何内容的上下文中完成所有工作。我的代码可以工作,但如果我能按照我解释的方式让它工作,那就太好了。

如果我们仍然可以[FromServices] 在一个属性上。那将是完美的解决方案。不幸的是,它被拿走了。这只会将上下文注入到服务或控制器的构造函数中。在这种情况下,我仍然必须将上下文作为参数传递给服务。

有没有办法将上下文注入服务构造函数并避免在创建时将其作为参数传递?

可能有更优雅的解决方案,我很乐意考虑。

【问题讨论】:

请添加有关您的代码的更多详细信息。什么是应用程序上下文。你做了什么尝试?它怎么不起作用?等 请注意,使用单个上下文实例不是好的做法。如果您要删除上下文的构造函数参数,那么这意味着您想要使用 ApplicationContext 的单例实例,这可能会在以后给您带来麻烦,因为它本质上不是线程安全的。 【参考方案1】:

例如,我您的控制器只有一种方法,然后引入单独的构造函数只是为了保存 ApplicationContext 没有优势。上下文已经包含在HttpContext 中,您可以使用[FromServices] 属性作为控制器操作的附加参数。见the documentation。例如

[Route("api/[controller]")]
public class MyController : Controller

    [HttpGet]
    public async IEnumerable<object> Get([FromServices] ApplicationContext context,
                                         MyType myMainParam)
    
        ...
    

RC1 允许使用[FromServices] 定义属性以从依赖注入中获取信息,但 RC2 将不再允许这样做(请参阅the announcement)。您可以在the answer 中找到这两种样式的示例。

【讨论】:

【参考方案2】:

这是对构造函数的依赖注入。使用 DI,您不应该直接初始化您的服务。您应该在 Startup.cs 中注册您的 ServiceApplicationContext

当你需要你的 Service 时,你应该通过构造函数将它注入到控制器中,DI 链会自动将 ApplicationContext 的实例注入到 Service 中。

当然,如果您不需要为控制器中的每个方法提供服务,则可以将其初始化为 @Oleg 所写的方法。

【讨论】:

这听起来不错,你能举个例子说明它是如何工作的。我不明白上下文将如何自动注入控制器。 以及服务如何获取请求(请参阅上面的编辑) 好吧,在更新的情况下,我认为你的 Service 的构造函数应该只接受 ApplicationContest。您应该在 Startup.cs 中注册您的 Service。然后你可以将它们注入到控制器的构造函数中,然后从控制器的方法中你可以调用你的 Service 的方法并将它们传递给请求。如果您需要在所有控制器中使用您的 Service,也许您可​​以将它们移到过滤器中? 好的 将它们移入过滤器是什么意思?我已经完成了其他所有事情。我有注入上下文的依赖链。我正在通过服务上的公共财产设置请求。但我不确定您将它们移入过滤器是什么意思。 您写道,您的服务读取请求中的标头变量并根据它们的值返回 XML。如果您需要为所有控制器中的所有请求提供该功能,则将其实现为过滤器,而不是控制器。但只是在你需要它的情况下。

以上是关于构造函数中上下文类的依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

laravel中的构造函数依赖注入理解

如何在其构造函数中获取使用依赖注入的类的实例

Spring-基于构造函数的依赖注入

Spring

DCI:如何使用依赖注入实现上下文?

PHP 依赖注入和松耦合