【问题标题】:How to use DI inside a static Method in Asp.net Core rc1如何在 Asp.net Core rc1 的静态方法中使用 DI
【发布时间】:2017-03-22 15:17:11
【问题描述】:

我看到默认模板使用ServiceProvder.GetService<ApplicationDbCotnext>() 来初始化一个 DbContext, 但是当你在静态方法中时,我不知道如何获得DbContext,因为没有ServiceProvider。 有没有办法获得ServiceProvider

【问题讨论】:

    标签: dependency-injection asp.net-core


    【解决方案1】:

    嗯,首先,这与 asp.net-core 本身无关。这与依赖注入的工作方式有关。你必须问自己为什么你的方法是静态的。真的有必要吗?

    如果你不能摆脱你的静态方法,你还不如一路引入另一个反模式,Service Locator Pattern。简而言之:在 Startup 类中,您将对 ServiceProvider 的引用放在静态类(例如“ServiceProviderProvider”)的静态属性中(例如称为“ServiceProviderSingleton”)。这样你就可以调用“ServiceProviderProvider.ServiceProviderSingleton.GetService()”了。

    再次,我建议对您的整体设计进行批判性的审视。但如果这是您需要/想要的,那么我希望它有所帮助。

    【讨论】:

    • 我找到了访问服务提供商的方法; var HttpContext = new Microsoft.AspNet.Http.Internal.HttpContextAccessor().HttpContext; var ServiceProvider = HttpContext.ApplicationServices;这是正确的方法吗?
    • 在需要访问数据库的长时间运行的后台任务的情况下,似乎能够访问服务是合理的(从静态类或您在外面工作的任何场景)请求管道)。
    • 仅供在 .net 2.0 中使用此功能并迁移到 .net 2.1 的任何人使用,您需要稍作更改,而不是在 startup.cs 中保留对 ServiceProvider 的引用,您需要改为引用 app.ApplicationServices 或你会得到一个对象处理错误。
    • 我非常不同意您的评估。静态方法和静态类通常是绝对必要的。我们从 OO 编程开始就一直在使用它们。它们非常适合不需要状态的代码部分。
    • @Dave 你到底不同意什么?从来没有说过静态没有用例。但是在这个 OP 的问题的背景下,我仍然相信我的回答是适当的。
    【解决方案2】:

    我们看看微软的静态方法(扩展)——他们似乎没有在那里使用日志记录——只是抛出适当的异常,例如在 UseMvc 方法中(用于 StartUp 类):

    https://github.com/aspnet/Mvc/blob/760c8f38678118734399c58c2dac981ea6e47046/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcApplicationBuilderExtensions.cs

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多