DI 在 MVC 项目的 ViewModel 中不工作
DI not working in ViewModel in MVC project
因此,我制作了一个使用 Unity 进行 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));
下面是我的视图模型中的 2 个构造函数:
public DeliveryEditViewModel(IVenturaRepository repository) : base(repository, new DeliveryViewModel()) { }
public DeliveryEditViewModel(IVenturaRepository repository, DeliveryViewModel model) : base(repository, model)
还有我的控制器:
public BaseController(IVenturaRepository repository)
堆栈跟踪的最后几行:
[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
我希望有人能帮我解决我的问题。
问题是我需要在我的视图模型中从我的统一容器中检索到的项目集合。但后来意识到,在构建视图模型时我不需要那个集合,我只需要其中之一的 id。所以放弃并尝试了另一种不违反 oo 原则或需要自定义模型绑定的方法。
因此,我制作了一个使用 Unity 进行 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));
下面是我的视图模型中的 2 个构造函数:
public DeliveryEditViewModel(IVenturaRepository repository) : base(repository, new DeliveryViewModel()) { }
public DeliveryEditViewModel(IVenturaRepository repository, DeliveryViewModel model) : base(repository, model)
还有我的控制器:
public BaseController(IVenturaRepository repository)
堆栈跟踪的最后几行:
[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
我希望有人能帮我解决我的问题。
问题是我需要在我的视图模型中从我的统一容器中检索到的项目集合。但后来意识到,在构建视图模型时我不需要那个集合,我只需要其中之一的 id。所以放弃并尝试了另一种不违反 oo 原则或需要自定义模型绑定的方法。