MvvmCross Viewmodel创建问题

时间:2014-04-30 14:30:09

标签: inversion-of-control mvvmcross

当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。有什么建议吗?

1 个答案:

答案 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();