2016-03-16 1 views
3

Я вижу УСПЕШНЫЙ шаблон использовать ServiceProvder.GetService<ApplicationDbCotnext>() для инициализации DbContext, Но когда вы внутри статического метода, я понятия не имею, как получить DbContext, потому что есть нет ServiceProvider. Есть ли способ получить ServiceProvider?Как использовать DI внутри статического метода в Asp.net ядро ​​rc1

ответ

3

Ну, во-первых, это не имеет никакого отношения к asp.net-core как таковой. Это больше связано с тем, как работает Dependency Injection. Вы должны спросить себя, почему ваш метод статичен. Это действительно необходимо?

Если вы не можете избавиться от своего статического метода, вы также можете пройти весь путь и ввести еще один анти-шаблон, Service Locator Pattern. Короче говоря: в классе Startup вы ставите ссылку на ServiceProvider в статическом свойстве (называете его «ServiceProviderSingleton») статического класса (например, «ServiceProviderProvider»). Таким образом вы можете просто вызвать «ServiceProviderProvider.ServiceProviderSingleton.GetService()».

Опять же, я предлагаю критически взглянуть на ваш чрезмерный дизайн. Но если это то, что вам нужно/нужно, я надеюсь, что это помогло.

+0

I найти способ доступа к поставщику услуг; 'var HttpContext = new Microsoft.AspNet.Http.Internal.HttpContextAccessor(). HttpContext; var ServiceProvider = HttpContext.ApplicationServices; 'Это правильный путь? – John

+0

Он работает только на полном Clr. Спасибо – John

+1

В случае выполнения многолетней фоновой задачи, которая должна иметь доступ к базе данных, кажется, что доступ к службам оправдан (либо из статического класса, либо из любого сценария, в котором вы работаете за пределами конвейера запроса). –

0

I мы посмотрим на статические методы Microsoft (расширение) - они, похоже, не использовать протоколирование там - просто выбросить соответствующее исключение, например, в методе UseMvc (для класса StartUp):

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

Смежные вопросы