Inject a dependency into a custom model binder and using InRequestScope using Ninject

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

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

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

NInjectModule:

public class PostRepositoryModule : NinjectModule
{
    public override void Load()
    {
        this.Bind().To().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());
}

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

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

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

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

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

7
задан Ruben Bartelink 8 October 2012 в 13:14
поделиться