当viewmodel依赖项分布在不同的项目中时,我无法实例化viewmodel。
ViewModel构造函数如下:
public MyViewModel(IMyBusinessLogic businessLogic)
{
...
}
public class App : Cirrious.MvvmCross.ViewModels.MvxApplication
{
public override void Initialize()
{
CreatableTypes().
EndingWith("BusinessLogic").
AsInterfaces().
RegisterAsLazySingleton();
RegisterAppStart<MyViewModel>();
}
}
IMyBusinessLogic处于同一解决方案的不同项目中。此接口的实际实现位于不同的项目中。
我在viewmodel项目中添加了业务逻辑接口项目作为参考。
任何人都可以帮忙解决这个问题吗?
错误日志:
mvx:Diagnostic:0.12显示ViewModel MyViewModel'TaskHost.exe' (CoreCLR:Silverlight AppDomain):已加载 'C:\数据\程序{9E891FD9-C43E-4ED3-9EDC-153E29371D89} \安装\ BusinessLogic.Interface.DLL'。 符号已加载。 mvx:警告:0.38创建类型的viewModel时出现问题 MyViewModel - 问题MvxIoCResolveException:无法解决 IMyBusinessLogic类型的参数myBusinessLogic的参数 创建ViewModel.Core.MyViewModel 在Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.GetIoCParameterValues(Type type,ConstructorInfo firstConstructor)at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct(Type type)
在Cirrious.CrossCore.Mvx.IocConstruct(Type t)at Cirrious.MvvmCross.ViewModels.MvxDefaultViewModelLocator.TryLoad(类型 viewModelType,IMvxBundle parameterValues,IMvxBundle savedState, IMvxViewModel&安培; viewModel)'TaskHost.exe'(CoreCLR:Silverlight AppDomain):已加载 'C:\ WINDOWS \ SYSTEM32 \ EN-US \ mscorlib.debug.resources.dll'。模块是 没有符号构建。
@Stuart: 正如在wiki中提到的那样,我已经覆盖了特定于平台的UI项目中存在的Setup.cs中的GetViewModelAssemblies()方法。
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。有什么建议吗?
答案 0 :(得分:0)
要在多个程序集中查找ViewModel,您可以使用https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#providing-additional-view-and-viewmodel-assemblies
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/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control是一个很好的起点&lt; - 推荐阅读。
当然,你也可以在核心以外的程序集上使用相同类型的注册逻辑 - 例如:typeof(Reusable.Helpers.MyHelper).Assembly.CreatableTypes() .EndingWith("Helper") .AsInterfaces() .RegisterAsDynamic();