[英]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.