При создании нового элемента при отправке информации из формы обратно в контроллер говорится, что конструктор без параметров не найден. Это ожидается, поскольку модель представления, используемая в качестве модели представления, зависит от объекта модели домена.Когда вы хотите использовать IDependencyResolver над IModelBinder?
Затем я решил написать свое собственное связующее устройство.
NewItemViewModelBinder
public class NewItemViewModelBinder : DefaultModelBinder {
public NewItemViewModelBinder(IKernel kernel) {
if (kernel == null) throw new ArgumentNullException("kernel");
this.kernel = kernel;
}
protected override object CreateModel(ControllerContext controllerContext
, ModelBindingContext bindingContext, Type modelType) {
return kernel.Get(modelType);
}
private readonly IKernel kernel;
}
Это решение с моделью связующего работал нормально, имеющий зарегистрировав это связующее к ModelBinders.Binders в рамках метода NinjectWebCommon.RegisterServices.
public void RegisterServices(IKernel kernel) {
CompositionRoot.ComposeObjectGraph();
ModelBinders
.Binders
.Add(typeof(NewItemViewModel), new NewItemViewModelBinder(kernel));
}
Кроме того, я также столкнулся с некоторыми другими сообщениями, которые говорили о DependencyResolver. Поэтому я подумал, что если я смогу написать идентификатор зависимостей, который бы разрешил все другие проблемы с созданием, я остался бы без проблем для остальных.
NinjectDependencyResolver
public class NinjectDependencyResolver : NinjectDependencyScope
: System.Web.Http.Dependencies.IDependencyResolver
, System.Web.Mvc.IDependencyResolver {
public NinjectDepencyResolver(IKernel kernel
, IDependencyScopeFactory factory) : base(kernel) {
if (kernel == null) throw new ArgumentNullException("kernel");
if (factory == null) throw new ArgumentNullException("factory");
this.kernel = kernel;
}
public IDependencyScope BeginScope() {
return factory.Create(kernel.BeginBlock());
}
public object GetService(Type serviceType) {
return kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType) {
return kernel.GetAll(serviceType);
}
public void Dispose() { base.Dispose(); }
private readonly IKernel kernel;
private readonly IDependencyScopeFactory factory;
}
И после установки этого нового распознаватель как распознаватель зависимостей для MVC,
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
он не работает, и у меня была такая же проблема, как параметрируемую меньше конструктора.
Итак, у меня есть три вопроса.
- Что я сделал неправильно с подходом DependencyResolver?
- В чем преимущества работы с DependencyResolver по сравнению с ModelBinder?
- Когда использовать любой из них?
Просто добавьте конструктор параметрирования в модель вашего вида (ошибка вызывается из-за того, что внутри 'DefaultModelBinder' использует' Activator.CreateInstance' для инициализации экземпляра вашей модели представления, но не может, если у него нет конструктора без параметров. –
Да, я знаю это и уже сделал это сначала для исправления. Кроме того, мне не нравится исправлять мой код, поэтому это и есть причина вопроса, в то время как использование инсталляции конструктора лучше всего применять при правильном применении DI. Если бы я использовал значение по умолчанию конструктор, я должен был бы передать ему новый экземпляр модели. В результате я был бы тесно связан с кодом, чего именно следует избегать. –
Если у вас есть конструктор без параметров (в дополнение к вашему существующие конструкторы) вам не нужно _make его передать новый экземпляр модели_ 'DefaultModelBinder' инициализирует его и свяжет ваш va lues –