2016-09-14 82 views
1

我爲我的Xamarin表單項目使用Freshmvvm。我正在使用相機並希望使用平臺特定的功能。所以,我想知道如何使用IOC控件來使用特定於平臺的功能。Xamarin Forms:FreshMvvm中的IOC

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

如果我把從App類的代碼,如果我需要在iOS和Android的項目照相機類,如果是,那麼如何讓應用程序類知道我們要實現一個相機類一特定的平臺?還是有更好的方法來使用IOC控制,並在我們想要使用它時將接口注入到頁面模型(視圖模型)的構造器中?

回答

3

我想你以後是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系統。如果你保持命名相同,你甚至可以複製和粘貼這個標籤。

+0

這是我正在尋找。謝謝。 – TheDeveloper

+0

DependencyService默認情況下保持爲singleton,但有時使用FreshMVVM會創建一個新實例。任何想法爲什麼以及如何保持實例? – Dpedrinha

1

DependencyService建成Xamarin形式會做業務,但如果你想只使用國際奧委會Mvvmfresh你可以 -

一)註冊附近的窗體Init方法平臺特定的類(ES)(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 /形式使用時解析類項目 -

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

...