簡體   English   中英

MvvmCross和PCL服務層-如何使用特定於OS的功能

[英]MvvmCross and PCL Service Layer - how to use OS specific functions

谷歌搜索了一段時間,但沒有發現任何真正的好。

因此,問題是,在MVVM Cross guide中,我們的解決方案(針對移動平台)是分開的,例如, HelloWorld.Core項目和少數平台特定的項目,例如HelloWorld.Android.UI

您可以在這里查看完整的教程https://www.mvvmcross.com/documentation/tipcalc-tutorial/the-tip-calc-tutorial

而且,問題是,在我們的.Core項目中,我們創建了Services,ViewModels,並將其注冊在MVVM Cross提供的IoC容器中。

在MvvmCross文檔提供的示例中, Service實現非常簡單,只有一個功能

    public class CalculationService: ICalculationService
    {
        public double TipAmount(double subTotal, int generosity)
        {
            return subTotal * ((double)generosity)/100.0;
        }
    }

所以我們繼續,在App.cs注冊它,然后在綁定的ViewModel使用App.cs可以了

public class App: MvxApplication
    {
        public App()
        {
            Mvx.RegisterType<ICalculationService, CalculationService>();
            Mvx.RegisterSingleton<IMvxAppStart>(new MvxAppStart<HomeViewModel>());
        }
    }

查看型號代碼:

public class TipViewModel : MvxViewModel
    {
        readonly ICalculation _calculation;

        public TipViewModel(ICalculation calculation)
        {
            _calculation = calculation;
        }

    // ...

        double _tip;

        public double Tip
        {
            get {
                return _tip;
            }
            set
            {
                _tip = value;
                RaisePropertyChanged(() => Tip);
            }
        }

        void Recalculate()
        {
            Tip = _calculation.TipAmount(SubTotal, Generosity);
        }
    }

但是,關鍵是,當我開始嘗試時,我決定對一些簡單的本地存儲數據掃描程序進行編碼,以查找某些特定文件。

簡單的代碼示例:

 public class SimpleDataScanner : IBaseDataScanner
    {
        private string _basePath { get; set; }

        private List<string> _scanResult { get; set; }

        public SimpleDataScanner()
        {
            _basePath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            _scanResult = new List<string>();
        }

        public List<string> BasicDataScan(string startPath = null)
        {
            string startFolder = _basePath;

            if (startPath.Length > 0 && startPath.Length != null)
            {
                startFolder = Path.Combine(_basePath, startPath);
            }

            try
            {
                TreeScan(startFolder);
            }
            catch (Exception)
            {

                throw;
            }

            return _scanResult;

        }

        private void TreeScan(string path)
        {
            foreach (var file in Directory.GetFiles(path))
            {
                if (Path.HasExtension("pdf"))
                {
                    _scanResult.Add(file);
                }
            }
            foreach (string dir in Directory.GetDirectories(path))
            {
                TreeScan(dir);
            }
        }
    }

而且,據我發現,問題是:

1)我無法在PCL中使用Android特定的功能和屬性

2)我不能在PCL Core項目中使用引用來說其他一些Android類lib項目

因此,我無法創建有效的Service,這意味着無法在IoC容器中注冊它並傳遞給ViewModel。

做這種事情的方式是什么? 有教程嗎? 還是我把整個想法弄錯了?

您需要在平台代碼中實現該接口, Setup.cs在平台項目內的Setup.cs針對該接口注冊具體實現。 因此,在您的情況下, IDataScanner將存在於Core項目中,而SimpleDataScanner將存在於Android項目中。

Setup.cs ,您將像這樣注冊具體的實現:

protected override void InitializeFirstChance()
{
    base.InitializeFirstChance();

    Mvx.RegisterSingleton<IDataScanner>(() => new SimpleDataScanner());
}

本質上,如果該接口需要特定於平台的或完整的.NET框架代碼來實現,則這些基於平台的實現將存在於平台中並在平台設置中注冊。 如果接口和實現都在Core項目中共享,則可以在App.cs注冊依賴App.cs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM