Внедрение зависимости в пользовательский связыватель модели и использование InRequestScope с помощью Ninject

Я использую NInject с NInject.Web.Mvc.

Для начала я создал простой тестовый проект, в котором мне нужен экземплярIPostRepository для совместного использования между контроллером и пользовательским механизмом связывания во время одного и того же веб-запроса. В моем реальном проекте мне это нужно, потому что я получаюIEntityChangeTracker проблемы, когда у меня фактически есть два репозитория, обращающихся к одному и тому же графу объектов. Так что для простоты моего тестового проекта я просто пытаюсь использовать фиктивный репозиторий.

Проблема у меня в том что она работает по первому запросу и все. Соответствующий код ниже.

NInjectModule:

public class PostRepositoryModule : NinjectModule
{
    public override void Load()
    {
        this.Bind<IPostRepository>().To<PostRepository>().InRequestScope();
    }
}

CustomModelBinder:

public class CustomModelBinder : DefaultModelBinder
{
    [Inject]
    public IPostRepository repository { get; set; }

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        repository.Add("Model binder...");

        return base.BindModel(controllerContext, bindingContext);
    }
}

public class HomeController : Controller
{
    private IPostRepository repository;

    public HomeController(IPostRepository repository)
    {
        this.repository = repository;
    }

    public ActionResult Index(string whatever)
    {
        repository.Add("Action...");

        return View(repository.GetList());
    }
}

Global.asax:

protected override void OnApplicationStarted()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    ModelBinders.Binders.Add(typeof(string), kernel.Get<CustomModelBinder>());
}

Делая это таким образом, на самом деле создает 2 отдельных экземпляраIPostRepository а не общий экземпляр. Здесь есть кое-что, чего мне не хватает в отношении введения зависимости в мое связующее. Мой код выше основан на первом методе настройки, описанном вNInject.Web.Mvc wiki но я пробовал оба.

Когда я использовал второй метод,IPostRepository будет предоставлен только для самого первого веб-запроса, после которого по умолчанию не будет делиться экземпляром. Тем не менее, когда я получил это работает, я использовал по умолчаниюDependencyResolver поскольку я не мог на всю жизнь понять, как сделать то же самое с NInject (находясь в ядре, спрятанном в классе NInjectMVC3). Я сделал это так:

ModelBinders.Binders.Add(typeof(string),
    DependencyResolver.Current.GetService<CustomModelBinder>());

Я подозреваю, что причина этого работала только в первый раз, потому что это не разрешает его через NInject, поэтому жизненный цикл действительно обрабатывается MVC напрямую (хотя это означает, что я понятия не имею, как он разрешает зависимость).

Итак, как мне правильно зарегистрировать связыватель модели и заставить NInject ввести зависимость?

Ответы на вопрос(3)

Ваш ответ на вопрос