创建新项目时,将表单信息从表单发回控制器时,它表示不能找到无参数的构造函数。这是预期的,因为用作视图模型的视图模型取决于域模型对象。何时想通过IModelBinder使用IDependencyResolver?
然后我决定写我自己的模型活页夹。
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;
}
这与模型粘合剂溶液的工作只是罚款有已经登记该粘合剂的NinjectWebCommon.RegisterServices方法中的ModelBinders.Binders。
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来初始化您的视图模型的实例,但它不能除非它具有无斜构造函数的构造函数,所以抛出该错误 – 2015-02-08 21:27:02
是的,我知道这一点,并且已经开始修补了,另外,我讨厌修补我的代码,所以这就是问题的原因,而使用构造函数注入在适当地应用DI时是最好的,如果我使用默认构造函数,我将不得不通过一个新的模型实例,结果,我将紧密耦合代码,这正是要避免的。 – 2015-02-08 21:45:28
如果你有一个无参数的构造函数(除了你的现有的构造函数),你不必去_make它传递一个新的model_实例'DefaultModelBinder'将初始化它并绑定你的va lue – 2015-02-08 21:55:26