当视图模型依赖项分布在不同的项目中时,我无法实例化视图模型。
ViewModel构造函数如下所示:
public MyViewModel(IMyBusinessLogic businessLogic)
{
...
}
public class App : Cirrious.MvvmCross.ViewModels.MvxApplication
{
public override void Initialize()
{
CreatableTypes().
EndingWith("BusinessLogic").
AsInterfaces().
RegisterAsLazySingleton();
RegisterAppStart<MyViewModel>();
}
}
IMyBusinessLogic在同一解决方案的不同项目中。这个接口的实际实现在另一个项目中。
我在视图模型项目中添加了业务逻辑接口项目作为参考。
有人能帮助解决这个问题吗?
错误日志:
mvx:诊断:0.12显示ViewModel MyViewModel"TaskHost.exe"(CoreCLR:Silverlight AppDomain(:已加载"C:\Data\Programs{9E891FD9-C43E-4ED3-9EDC-153E29371D89}\Install\BusinessLogic.Interface.DLL"。已加载符号。mvx:警告:0.38创建类型的视图模型时出现问题MyViewModel-问题MvxIoCResolveException:未能解决IMyBusinessLogic类型的参数myBusinessLogic的参数创建ViewModel.Core.MyViewModel在Cirious.CrossCore.IoC.MvxSimpleIoCContainer.GetIoCParameterValues(类型类型,ConstructorInfo firstConstructor(Circurius.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct(类型类型(
在Cirious.CrossCore.Mvx.IocConstruct(类型t(Circurius.MvvvmCross.ViewModels.MvxDefaultViewModelLocator.TryLoad(类型viewModelType,IMvxBundle参数值,IMvxBundle保存状态,IMvxViewModel;viewModel('TaskHost.exe'(CoreCLR:SilverlightAppDomain(:已加载"C:\windows\system32\en-US\mscorlib.debug.resources.dll"。模块为建造时没有符号。
@斯图亚特:正如在wiki中提到的,我已经覆盖了Setup.cs中的方法GetViewModelAssemblies((,该方法存在于特定于平台的UI项目中。
protected override Assembly[] GetViewModelAssemblies()
{
var list = new List<Assembly>();
list.AddRange(base.GetViewModelAssemblies());
list.Add(typeof(BusinessLogic.Core.MyBusinessLogic).Assembly);
list.Add(typeof(BusinessLogic.Interface.IMyBusinessLogic).Assembly);
return list.ToArray();
}
但现在我观察到的是,调用的顺序是先是App.Initialize((,然后是Setup.GetViewModelAssemblies((。所以我再次看到了同样的问题,即无法从IoC中找到所需的类型来破坏视图模型。对此有什么建议吗?
要在多个程序集中查找viewmodel,可以使用https://github.com/MvvmCross/MvvmCross/wiki/Customising using App and Setup#提供其他视图和视图模型程序集
protected override Assembly[] GetViewModelAssemblies() { var list = new List<Assembly>(); list.AddRange(base.GetViewModelAssemblies()); list.Add(typeof(SomeTypeFromAdditionalViewModelAssembly1).Assembly); list.Add(typeof(SomeTypeFromAdditionalViewModelAssembly2).Assembly); list.Add(typeof(SomeTypeFromAdditionalViewModelAssembly3).Assembly); // ... return list.ToArray(); }
对于从不同程序集注册服务的IoC,有一个Assembly
扩展方法可用-请参阅https://github.com/MvvmCross/MvvmCross/wiki/Service Location and Inversion of Control#bulk registration by convention
如果您想了解IoC在MvvmCross中的工作原理,那么https://github.com/MvvmmCross/MvmmCross/wiki/Service-Location-and-Conversion-of-Control是一个很好的起点<-推荐阅读。
当然,你也可以在Core以外的程序集上使用相同类型的注册逻辑,例如:
typeof(Reusable.Helpers.MyHelper).Assembly.CreatableTypes() .EndingWith("Helper") .AsInterfaces() .RegisterAsDynamic();