【问题标题】:Equivalent of this Xamarin MVVMLight using SimpleIoc container to Xamarin Prism DryIoc使用 SimpleIoc 容器的此 Xamarin MVVMLight 等效于 Xamarin Prism DryIoc
【发布时间】:2018-07-14 00:35:49
【问题描述】:

以下是 Xamarin MVVMLight 中使用 SimpleIoc 容器的代码,现在我正在使用 DryIoccontainer 将其移植到 Xamarin Prism:

this.container.Register<IAsciiCommander>(() =>  {
      var commander = new AsciiCommander();
      commander.AddSynchronousResponder();
      commander.AddResponder(
          this.container.GetInstance<TranspondersMonitor>());
      commander.AddResponder(
          this.container.GetInstance<BarcodeMonitor>()); 
      return commander;
  });

以下是 ViewModelLocator 中的一些,我需要在 App.xaml.cs 中执行此操作

 this.container.Register<InventoryConfiguration>(true);
 this.container.Register<IInventoryConfigurator>(
     () => new InventoryConfigurator(
              this.container.GetInstance<IAsciiCommander>(),
              this.container.GetInstance<InventoryConfiguration>())
 );// This is done in ViewModelLocator

【问题讨论】:

    标签: c# xamarin.forms prism dryioc


    【解决方案1】:

    不确定 Prism,但 DryIoc 中受人尊敬的注册是:

    this.container.RegisterDelegate<IAsciiCommander>(r => { 
        var commander = new AsciiCommander();
        commander.AddSynchronousResponder();
        commander.AddResponder(r.Resolve<TranspondersMonitor>());
        commander.AddResponder(r.Resolve<BarcodeMonitor>());
        return commander; });
    

    第二个sn-p:

    this.container.Register<InventoryConfiguration>();
    this.container.RegisterDelegate<IInventoryConfigurator>(r => 
        new InventoryConfigurator(
            r.Resolve<IAsciiCommander>(), 
            r.Resolve<InventoryConfiguration>())
     );// This is done in ViewModelLocator
    

    关于true 参数,DryIoc 中没有这样的参数。您可以在注册后立即解析服务,但我认为只有当服务是单例时才有意义(DryIoc 中的Reuse.Singleton 参数)。

    通过立即解决,我的意思是只调用 Resolve 忽略结果,这样单例将被实例化并存储在容器单例范围内。

    【讨论】:

    • 第一个 sn-p 没有错误,但第二个没有错误,但是当我将 Register 更改为 RegisterDelegate 时没有错误。 this.container.Register(); this.container.RegisterDelegate(r => new InventoryConfigurator(r.Resolve(), r.Resolve()));我会测试它是否会做应该做的事............感谢您的快速回复
    • 我的视图模型还没有工作,我不知道它是否来自 sn-p 但我如何告诉容器注册一个类型并立即创建它的实例...... ..因为它在 this.container.Register() 下的 mvvmlight simpleioc 中完成; this.container.Register(true);那真的告诉容器立即创建该类型的实例
    • 是的,在第二个 sn-p 中将 Register 修复为 RegisterDelegate。
    • 我注册了这样的模型 containerRegistry.GetContainer().Register(); containerRegistry.GetContainer().Register();我想做构造函数注入,现在我收到这个错误“DryIoc.ContainerException:”并且视图拒绝加载,所以我想我没有很好地注册我的模型,因为它们没有接口。
    • 关于真正的参数建议:服务是单例的,你能给我举例说明如何在服务注册后立即解决.....一如既往地感谢
    猜你喜欢
    • 2019-10-06
    • 2019-04-07
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多