2014-02-21 3 views
0
public AccountController(IUserStore<ApplicationUser> userStore) 
    { 
     //uncommenting the following line, uses the correct context, but 
     //unit testing fails to work, as it is overwritten, so I need to use IoC 
     //to inject 

     //userStore = new UserStore<ApplicationUser>(new ApplicationDbContext()); 

     UserManager = new UserManager<ApplicationUser>(userStore); 

Каким должен быть мой привязку ninject? Единственное, что я мог получить, даже для компиляции, выглядит следующим образом, но это не приводит к правильному контексту.Какую привязку ninject следует использовать?

 kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>(); 

, который является обязательным к чему-то, но не правильный контекст, используемый в закомментированного линии

ответ

2

Попробуйте использовать ConstructorArgument

kernel.Bind<IUserStore<ApplicationUser>() 
    .To<UserStore<ApplicationUser>>() 
    .WithConstructorArgument(new ConstructorArgument("context", new ApplicationDbContext()) 

Но ...

В реальность, вы должны также ввести зависимость в UserStore<ApplicationUser>, путем связывания ApplicationDbContext. Рамки будет строить весь граф для вас:

kernel.Bind<ApplicationDbContext>().ToSelf()

+0

Это работало, но вторая линия не была необходима, хотя я возьму слово, что я, наверное, нужно. Краткий поиск Google не вызывает никаких простых руководств для WithConstructorArgument. Я буду продолжать смотреть. – WhiskerBiscuit

+0

BTW, что вы подразумеваете под всем графиком? – WhiskerBiscuit

+0

Весь ваш график зависимости. A зависит от B, который зависит от C и т. Д. При правильном настройке всех привязок, когда вы создаете A через контейнер, B вводится в A, а C вводится в B. – cvbarros

0

От cvbarros ответа мы придумали следующее:

kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope(); 
kernel.Bind<IUserStore<ApplicationUser>>() 
    .To<UserStore<ApplicationUser>>() 
    .WithConstructorArgument("context", context => kernel.Get<ApplicationDbContext>()); 

Это позволяет ApplicationDbContext быть введены и/или в UserManager к вводиться. Он также позволяет UserManager получить ApplicationDbContext из инжектора зависимостей вместо создания нового экземпляра.

Примечание Этот код идет в /App_Start/NinjectWebCommon.cs файл

+1

ApplicationDbContext в SingletonScope кажется мне немного опасным. –

+1

Ответ обновлен на основе комментария Ахмета. InSingletonScope совсем не то, что мы хотели. Мы искали InRequestScope. InSingletonScope вызвал ряд проблем с приложением. Спасибо за комментарий Ахмет. –

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