2015-11-25 4 views
1

У меня есть некоторый код, который я ищу, чтобы реорганизовать, который выглядит примерно так:Как использовать Ninject заменить репозиторий автокрепеж

public static class RepositoryFactory 
{ 
    public static IRepository Create(RepositoryType repositoryType) 
    { 
     switch(repositoryType) 
     { 
      case RepositoryType.MsSql: 
       return new MsSqlRepository(); 
       break; 
      case RepositoryType.Postgres: 
       return new PostgresRepository(); 
       break; 
      //a lot more possible types 
     } 
    } 
} 

который вызывается на основе параметров из запроса HTTP:

public ActionResult MyAction() 
{ 
    var repoType = RepositoryType.MsSql; //Actually determined from HTTP request, could be any type. 
    var repository = RepositoryFactory.Create(repoType); 
} 

так что я действительно хотел сделать, это рефакторинг так, что мой контроллер выглядит следующим образом:

[Inject] 
public ActionResult MyAction(IRepository repository) 

Но так как RepositoryType может меняться по каждому запросу, я не могу понять, как использовать условную привязку ninject, чтобы это произошло. Я знаю, как использовать условную привязку вообще, например Bind<IRepository>().ToMethod() и Bind<IRepository>().To<MsSqlRepository>().WhenInjectInto() и т. Д., Но я не могу понять, что делать, когда условие привязки поступает из внешнего источника.

+0

пожалуйста, показать весь код, как вы определяете тип запроса HTTP. Наверное, вы пытаетесь обратиться к HTTP-запросу статически? Доступен ли он при наличии конструктора класса? – BatteryBackupUnit

ответ

1

Это на самом деле должно быть довольно легко:

kernel.Bind<IRepository>().To<MsSqlRepository>() 
     .When(ctx => System.Web.HttpContext.Current.... (condition here)); 

kernel.Bind<IRepository>().To<PostgresRepository>() 
     .When(ctx => System.Web.HttpContext.Current.... (condition here)); 

Вы также можете определить один в качестве «по умолчанию», а другой в качестве условного одного:

// this will be used when there's not another binding 
// for IRepository with a matching When condition 
kernel.Bind<IRepository>().To<MsSqlRepository>(); 

// this will be used when the When condition matches 
kernel.Bind<IRepository>().To<PostgresRepository>() 
     .When(ctx => System.Web.HttpContext.Current.... (condition here)); 
Смежные вопросы