2016-09-14 20 views
1

私はXamarinフォームプロジェクトにFreshmvvmを使用しています。私はカメラを使用しており、プラットフォーム固有の機能を使用したいと考えています。そこで、IOCコントロールを使用してプラットフォーム固有の機能を使用するにはどうすればいいのかと思いました。Xamarinフォーム:FreshMvvmのIOC

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

私はアプリのクラスからこのコードを呼び出す場合ははい、次にアプリクラスをできるようにどのように我々は1のCameraクラスを実装したい知っていれば、私は、iOSとAndroidのプロジェクトの両方にカメラのクラスを持っている必要がある場合特定のプラットフォームですか?またはIOCコントロールを使用して、ページモデル(ビューモデル)のコンストラクタにインタフェースを挿入して使用したい場合は、より良い方法がありますか?

答えて

3

私はあなたが何をしているかはDependency Serviceだと思います。これにより、ネイティブ機能にアクセスできます。

このようにして、共有コードにインターフェイスICameraを作成する必要があります。

public interface ICamera 
{ 
    void TakePicture(); 
} 

これで、このインターフェイスをプラットフォーム固有のプロジェクトに実装できます。 iOSの例えば

あなたはこのようにそれを実装するかもしれません:

パブリッククラスCameraImplementation:Iカメラ 今{ ます。public void TakePicture() {ここ // iOSのコード } }

キーはここに登録する方法です。あなたはこのように、プラットフォーム固有の実装の名前空間上にこののようなタグを追加することによってこれを行うことができます。同じは、Androidのために行く

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

。名前を同じにしておくと、このタグをコピーして貼り付けることさえできます。

Xamarinフォームに組み込まれたDependencyServiceがビジネスを行うが、あなただけMvvmfreshであなたにIOCを使用したい場合はすることができます
+0

これは私が探しているものです。ありがとうございました。 – TheDeveloper

+0

DependencyServiceはデフォルトではシングルトンとして保持しますが、FreshMVVMでは新しいインスタンスを作成することがあります。どのようなアイデアの理由とインスタンスの保持方法? – Dpedrinha

1

-

a)のIOSは、以下の(フォームのInitメソッドの近くに、ご使用のプラットフォーム固有のクラス(複数可)を登録) - あなたのクラスはいつものように、プラットフォーム側に存在すると

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"); 

... 
関連する問題