2015-04-29 3 views
0

У меня есть класс, который получает промежуточный текущий пользователь, вошедший в приложение из базы данных для текущего запроса:ASP.NET 5 DI Регистрация От Middleware

public class CurrentUserMiddleware 
{ 
    RequestDelegate m_next; 
    UserManager<User> m_userManager; 

    public CurrentUserMiddleware(RequestDelegate next, UserManager<User> userManager) 
    { 
     m_next = next; 
     m_userManager = userManager; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     var userId = context.User.Identity.GetUserId(); 
     var user = await m_userManager.FindByIdAsync(userId); 

     var currentUserContext = new CurrentUserContext { User = user }; 

     // Register CurrentUserContext with DI to this currentUserContext instance 

     await m_next(context); 
    } 
} 

После этого будет решена, я хочу, чтобы зарегистрировать CurrentUserContext которые могут быть разрешены в других областях моего приложения через DI.

Например:

public class HomeController : Controller 
{ 
    private readonly CurrentUserContext m_currentUserContext; 

    public HomeController(CurrentUserContext currentUserContext) 
    { 
     m_currentUserContext = currentUserContext; 
    } 

    public async Task<IActionResult> Index() 
    { 
     var userName = m_currentUserContext.User.Username; 
     return View(); 
    } 
} 

Как правильно зарегистрировать CurrentUserContext? Все остальные записи DI выполняются в StartupConfigureServices, однако это не работает для этого случая, так как мне нужно разрешить CurrentUserContext по каждому запросу.

ответ

1

Не уверен, что DI контейнер вы используете, так что немного родовым ...

Для большинства DI контейнеров по умолчанию Инстанциации за вызов, поэтому независимо от того, где он зарегистрирован на момент создания экземпляра объекта, который вы можете получить доступ к текущий контекст. Большинство контейнеров также предоставляют возможность указывать метод «factory» вместо имени типа, поэтому вы можете просто вызвать свой метод «Invoke» с такой фабрики.

Обратите внимание, что большинство контейнеров не поддерживают разрешение async, так что вы можете зарегистрировать объекты, которые дают доступ к вам «контексту пользователя» асинхронный:

ICreateUserContext { Task<CurrentUserContext> GetContextAsync();} 
+0

Спасибо за подсказку. Я смог решить свою проблему с вашим предложением «заводского» стиля, переместив «CurrentUserContext» в свойство, зарегистрированное в контейнере DI в «ConfigureServices», а затем разрешен в промежуточном программном обеспечении. – kspearrin

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