Ninject получение универсального типа в ToMethod

#ninject

#ninject

Вопрос:

У меня есть такой репозиторий:

 public class Repository<T> : IRepository<T> where T : class
{
    private readonly ISession session;

    public Repository(ISession session)
    {
        this.session = session;
    }
}
  

Я использую NHQ, и я обычно делаю это, чтобы получить объект ISession:

 SessionFactory.For<T>().OpenSession();
  

Как мне настроить Ninject на автоматическое создание сеанса для запрошенного типа и его привязку? Я пробовал это, но я не знаю, что вставить в For<>():

 kernel.Bind(typeof(IRepository<>))
    .To(typeof(Repository<>))
    .WithConstructorArgument("session", SessionFactory.For<>().OpenSession());
  

Похоже, мне нужно получить используемый универсальный тип и передать его в For<>()

Как мне это сделать?

Ответ №1:

Вы не должны использовать WithConstructorArgument ; вместо этого создайте привязку для ISession.

 kernel.Bind<ISession>.ToMethod(context => ....).InRequestScope();
  

Вы можете получить IRepository<> тип из context.Request.ParentRequest.Service . Теперь вы можете извлечь тип объекта с помощью отражения. Однако, если вы используете одну и ту же базу данных для всех объектов, то, вероятно, проще вернуть общий сеанс для всех репозиториев.