控制反转-MvvvmCross-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在同一解决方案的不同项目中。这个接口的实际实现在另一个项目中。

我在视图模型项目中添加了业务逻辑接口项目作为参考。

有人能帮助解决这个问题吗?

错误日志:

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

相关内容

  • 没有找到相关文章

最新更新