【问题标题】:MvvmCross Viewmodel creation issueMvvmCross Viewmodel 创建问题
【发布时间】:2014-04-30 14:30:09
【问题描述】:

当视图模型依赖项分布在不同的项目中时,我无法实例化视图模型。

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:\Data\Programs{9E891FD9-C43E-4ED3-9EDC-153E29371D89}\Install\BusinessLogic.Interface.DLL'。 已加载符号。 mvx:警告:0.38 创建视图模型类型的问题 MyViewModel - 问题 MvxIoCResolveException: 无法解决 类型为 IMyBusinessLogic 的参数 myBusinessLogic 时的参数 创建 ViewModel.Core.MyViewModel 在 Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.GetIoCParameterValues(类型 类型,ConstructorInfo firstConstructor)在 Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct(类型类型)
在 Cirrious.CrossCore.Mvx.IocConstruct(Type t) 在 Cirrious.MvvmCross.ViewModels.MvxDefaultViewModelLocator.TryLoad(类型 viewModelType, IMvxBundle parameterValues, IMvxBundle savedState, IMvxViewModel& viewModel) 'TaskHost.exe' (CoreCLR: Silverlight 应用程序域):已加载 'C:\windows\system32\en-US\mscorlib.debug.resources.dll'。模块是 无符号构建。

@斯图尔特: 正如 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 中找到所需的类型来创建视图模型。对此有何建议?

【问题讨论】:

  • 我做了更多分析。目前我观察到的是,MvxApplication: CreatableTypes() 方法只查找当前的 Dll,而不是其他已加载的 Dll。而且由于我的接口和接口的实际实现位于不同的 dll 中,因此无法在这些 dll 中查找,因此业务逻辑类没有被注册。 有什么方法可以让 MvxApplication: CreatableTypes() 方法在所有加载的 Dll 中查找?
  • 我现在在移动设备上......但这在 wiki 的某个地方 - 在设置中查找视图模型程序集
  • @Stuart :试图覆盖 GetViewModelAssemblies(如上面的问题所示)。仍然遇到同样的问题。我在这里缺少什么吗?

标签: inversion-of-control mvvmcross


【解决方案1】:

要在多个程序集中查找 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 是一个很好的起点

当然,您也可以在除 Core 之外的程序集上使用相同类型的注册逻辑 - 例如:

   typeof(Reusable.Helpers.MyHelper).Assembly.CreatableTypes()
       .EndingWith("Helper")
       .AsInterfaces()
       .RegisterAsDynamic();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多