Я использую 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 внедрить зависимость?