【问题标题】:Xamarin Forms: IOC in FreshMvvmXamarin 形式:FreshMvvm 中的 IOC
【发布时间】:2017-01-22 17:46:06
【问题描述】:

我正在为我的 Xamarin 表单项目使用 Freshmvvm。我正在使用相机并想使用特定于平台的功能。所以,我想知道如何使用 IOC 控件来使用特定于平台的功能。

Freshmvvm.FreshIOC.Container.Register<ICamera,Camera>();

如果我从 App 类调用此代码,我是否需要在 iOS 和 Android 项目中都有相机类,如果是,那么如何让应用类知道我们想要实现一个特定平台的相机类?或者有没有更好的方法来使用 IOC 控制并将接口注入到页面模型(视图模型)的构造函数中?

【问题讨论】:

    标签: mvvm xamarin xamarin.forms freshmvvm


    【解决方案1】:

    我认为您所追求的是Dependency Service。这使您能够访问本机功能。

    这样你必须在你的共享代码中创建一个接口,例如ICamera

    public interface ICamera
    {
       void TakePicture();
    }
    

    现在您可以在平台特定项目中实现此接口。

    例如在 iOS 上,你可以这样实现它:

    公共类 CameraImplementation : ICamera { 公共无效 TakePicture() { // 这里是 iOS 代码 } }

    现在的关键是如何注册。您可以通过在平台特定实现的命名空间上添加类似这样的标签来实现此目的,如下所示:

    [assembly: Xamarin.Forms.Dependency (typeof (CameraImplementation))]
    namespace yourapp
    {
       // CameraImplementation class here
    }
    

    Android 也是如此。如果您保持命名相同,您甚至可以复制并粘贴此标签。

    【讨论】:

    • 这就是我要找的。谢谢。
    • DependencyService 默认情况下将其保持为单例,但使用 FreshMVVM 有时它会创建一个新实例。知道为什么以及如何保留实例吗?
    【解决方案2】:

    Xamarin Forms 中内置的 DependencyService 可以完成这项业务,但如果您只想在 FreshMvvm 中使用 IOC,您可以 -

    a) 在 Forms Init 方法附​​近注册您的平台特定类(IOS 如下) -

    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
            global::Xamarin.Forms.Forms.Init();
    
            InitIoc();
    
            LoadApplication(new App());
    
            return base.FinishedLaunching(app, options);
    }
    
    private void InitIoc()
    {
            FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
    }
    

    你的班级像往常一样存在于平台端 -

    public class FileHelper : IFileHelper
    {
        public string GetLocalFilePath(string filename)
        {
            string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    

    然后在您的 PCL/Forms 项目中使用该类时解析该类 -

    IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
    string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");
    
    ...
    

    【讨论】:

      【解决方案3】:

      免责声明:我对 IOC、DI 和 FreshMvvm 非常陌生。刚刚得到这个为自己工作,并想分享以帮助其他人,以防他们像我一样偶然发现这个论坛。

      Xamarin Forms 提供的DependencyService 非常棒,但仍然有限(例如,无法实现构造函数注入)。在使用 DependencyService 的同时实现单元测试也可能会变得有点麻烦。 Here 是一个教程,如果您坚持使用 DependencyService 但又想对代码进行单元测试,它将带您完成一些步骤。它是一个服务定位器,比依赖注入更难(在我看来)测试。

      我没有使用它,而是使用 FreshMvvm 的 IOC 来访问特定于平台的代码。 @WickedW 所说的一切都是完全正确的。我只是稍微调整了最后一步。

      而不是直接解决依赖关系:

      IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
      string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");
      

      我使用了构造函数注入:

      Public class MainPageModel : FreshBasePageModel
      {
          public string YourLabelText { get; set;}
          IFileHelper _fileHelper;
          public MainPageModel(IFileHelper fileHelper)
          {
              _fileHelper = fileHelper
          }
      
          // This is implemented by FreshBasePageModel
          public override void Init(object initData)
          {
              YourLabelText = _fileHelper.GetLocalFilePath(“CoreSQLite.db3”);
          }   
      }
      

      确保在加载应用程序之前注册您的平台特定类:

      FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
      global::Xamarin.Forms.Forms.Init();
      LoadApplication(new App());
      
      return base.FinishedLaunching(app, options);
      

      我必须这样做,因为我在 App.xaml.cs 的构造函数中解析了 MainPageModel:

      public App()
          {
              InitializeComponent();
      
              var page = FreshPageModelResolver.ResolvePageModel<MainPageModel>();
              var navContainer = new FreshNavigationContainer(page);
              MainPage = navContainer;
          }
      

      @WickedW 完全正确地完成了特定于平台的实现,然后我就使用了 Michael Ridland 的 FreshMvvm n=2 视频来弄清楚构造函数注入,因为这是我个人需要的功能。希望这可以帮助像我一样努力解决这个问题的人?。

      【讨论】:

        猜你喜欢
        • 2018-03-21
        • 2019-10-09
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 2021-10-05
        • 1970-01-01
        相关资源
        最近更新 更多