創建新項目時,將表單信息從表單發回控制器時,它表示不能找到無參數的構造函數。這是預期的,因爲用作視圖模型的視圖模型取決於域模型對象。何時想通過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