在创建新项目时,当将信息从表单发送回控制器时,它表示找不到无参数构造函数。这是意料之中的,因为用作视图模型的视图模型取决于域模型对象。
然后我决定编写自己的模型活页夹。
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 有什么好处?
- 什么时候使用其中一个?