【发布时间】:2017-03-22 15:17:11
【问题描述】:
我看到默认模板使用ServiceProvder.GetService<ApplicationDbCotnext>() 来初始化一个 DbContext,
但是当你在静态方法中时,我不知道如何获得DbContext,因为没有ServiceProvider。
有没有办法获得ServiceProvider ?
【问题讨论】:
标签: dependency-injection asp.net-core
我看到默认模板使用ServiceProvder.GetService<ApplicationDbCotnext>() 来初始化一个 DbContext,
但是当你在静态方法中时,我不知道如何获得DbContext,因为没有ServiceProvider。
有没有办法获得ServiceProvider ?
【问题讨论】:
标签: dependency-injection asp.net-core
嗯,首先,这与 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;这是正确的方法吗?
我们看看微软的静态方法(扩展)——他们似乎没有在那里使用日志记录——只是抛出适当的异常,例如在 UseMvc 方法中(用于 StartUp 类):
【讨论】: