DI不在MVC项目的ViewModel中工作

时间:2018-04-21 20:20:43

标签: c# model-view-controller dependency-injection unity-container service-locator

所以,我做了一个使用Unity for DI的mvc项目,控制器与DI完美配合,但我的视图模型没有。我10年前就遇到过这个问题但是不记得究竟该如何修复它。只记得我将Service Locator和Unity结合起来才能使它工作。 因此,当我在其中一个视图的编辑页面上进行回发时会出现问题。它尝试创建视图模型,但它没有无参数构造函数。 DI应该可以解决这个问题。可能做错了,但在网上搜索了一个小时后,我空了。下面是我在Global.asax.cs

中添加到Application_Start()的代码
var container = new UnityContainer();
container.RegisterType<IVenturaRepository, TestRepository>(new PerResolveLifetimeManager());
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

以下是我的viewmodel中的2个构造函数:

public DeliveryEditViewModel(IVenturaRepository repository) : base(repository, new DeliveryViewModel()) { }
public DeliveryEditViewModel(IVenturaRepository repository, DeliveryViewModel model) : base(repository, model)

我的控制员:

public BaseController(IVenturaRepository repository)

stacktrace的最后几行:

[MissingMethodException: Er is geen parameterloze constructor voor dit object opgegeven.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +119
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +247
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
   System.Activator.CreateInstance(Type type) +11
   System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +197

我希望有人可以帮我解决问题。

1 个答案:

答案 0 :(得分:0)

问题是我需要在我的viewmodel中从我的Unity容器中检索的项目集合。但后来意识到,在构建视图模型时我不需要那个集合,我只需要其中一个。所以放弃了它并尝试了另一种不违反原则或需要自定义模型绑定的方法。