0

Я создаю новый проект MVC 5 с шаблонизированной реализацией Asp.Identity. То, что я хотел бы сделать, это использовать существующую реализацию Asp.Identify в моих собственных доменах. Например, пользователь Asp.Identity может быть членом 1 или более клубов. Я хотел бы иметь доступ к информации о пользователе в моих контроллерах MVC - например, я хотел бы узнать, является ли пользователь частью определенной роли или нет и т. Д..net MVC IdentityDbContext Injection Dependency

В основном я все еще немного путают по ряду вопросов, которые я хотел бы уточнить.

В Startup.Auth.cs добавлен ApplicationUserManager и связанная с ним инфраструктура Entity DBContext. т.е.

app.CreatePerOwinContext(ApplicationDbContext.Create); 
  1. Будет ли эта структура Entity DbContext быть добавлены к каждому MVC контроллер - это делается с помощью инъекции зависимостей?

  2. Если его инъецировали IOC - он создан по HTTP-запросу?

Я расширяю существующий шаблонный ApplicationDbContext, добавляя к нему свои собственные объекты домена (как показано ниже). 3. Смогу ли я получить доступ ко всем этим в MVC Controillers и снова это за запрос?

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
    : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
    return new ApplicationDbContext(); 
    } 

//Add my own domain entities here... 
    public virtual DbSet<Address> Address { get; set; } 
    public virtual DbSet<Club> Clubs { get; set; } 
} 
+0

Пожалуйста, задайте свой вопрос для значимого названия. Пока это всего лишь ярлыки тегов. – abatishchev

ответ

1

Чтобы ответить на ваши вопросы:

  1. Да, это создается для каждого запроса. Имя метода называется CreatePerOwinContext(), поэтому он создает это ApplicationDbContext каждый раз, когда создается OwinContext (по каждому запросу).
  2. Нет, это не инъекция зависимости как таковой. Это контекст Owin, создающий новый контекст и содержащий его в бутстрапере Owin для жизни запроса. Это работает так же, как и для многих контейнеров Dependency Injection, поскольку он контролирует время жизни объекта, но это само по себе не делает инъекции, и он не будет вводить контекст сам по себе в ваши контроллеры или что-то еще.
  3. Да, вы можете получить доступ к ним в контроллерах, используя Context.GetOwinContext().Get<ApplciationDbContext>(). Поскольку он возвращает ApplicationDbContext, вы можете делать все, что вы можете сделать с помощью ApplicationDbContext. Поэтому, если вы его расширите, также будут доступны эти расширенные свойства.

Если вы хотите сделать DI с контейнером с Owin, вам нужен DependencyResolver, который знает Owin. Большинство контейнеров обеспечивают один для их инъекции. Например, Ninject предоставляет пакет Ninject.Web.Common.OwinHost nuget, который позволяет вам использовать конфигурацию app.UseNinjectMiddleware()

+0

Спасибо Эрик - просто уточнить. Если я хочу иметь доступ к ApplicationDBContext (Entity framework dbcontext) в моих MVC-контроллерах, мне не нужно вводить их с помощью IOC (framework injection dependency framework), поскольку он уже будет использоваться с помощью метода CreatePerOwinContext(). Это верно? И эта «правильная \ хорошая» практика? – gisWeeper

+0

@gisWeeper - я не говорил об этом, не знаю, где у вас такое впечатление. Я ответил на ваши вопросы, я не делал никаких рекомендаций относительно того, было ли это правильно или что вам нужно делать. Вы просто спросили, была ли это инъекция зависимостей, я сказал, что это не так. Я сказал, что вы * МОЖЕТЕ * получить доступ к ним в своем контроллере через GetOwinContext, а не то, что это был правильный или лучший способ. Это не значит, что вы не должны вводить их.MVC не обеспечивает инъекцию сам по себе (по крайней мере, не в текущей версии). –

+0

Извинения Эрик - я прыгнул с этой пушки. – gisWeeper