2017-03-27 12 views
3

私はXamarinで始まり、私は立ち往生しています。すべてのxamarinページ間でクラスインスタンスを共有するにはどうすればよいですか?

私は3つの異なるページを持っていますが、どのようにそれらのすべてでクラスインスタンスを共有できますか?例えば

//I have this class instance in the first page 
Person p = new Person("Jack"); 

//And I'd like to get the content in all pages 
string name = p.getName(); 

たちはパラメータでインスタンスを渡さずにいることを行うことができますか?

おかげ

答えて

5

が最も簡単な方法は、あなたのXamarin.FormsApplicationクラス/インスタンスからそれを割り当て、アクセスすることです:

public class App : Application 
{ 
    public MySharedClass MySharedObject; 
    ~~~ 
} 

次に、あなたの他のページのいずれかから、あなたは現在のApplicationにアクセスすることができます。

var obj = (Application.Current as App).MySharedObject; 
+0

パーフェクト!それは仕事だ – NoteStylet

4

私は通常、クライアント(つまりページ/ビューモデル)の値/インスタンスを返すサービスを作成します。

私は通常、この値を必要とするすべてのマイページまたはビューモデルのコンストラクタ引数としてこのサービスを挿入します。

その結果、私が特定した戦略に関係するいくつかの式があります。しかし、私が記述した手法は単体テスト可能であるという利点があります。したがって、証明された(別名:テスト可能な)コードを書くことは、長期的には時間を節約します。

Appクラスにプロパティを追加するのはすばやく、汚いことに注意してください。しかし、それはテスト容易性には適していません。したがって、単体テストでは、ビジネスロジックのスライスを検証するためにアプリケーションインスタンス全体を起動する必要はありません。

もう1つの方法は、ページ/ビューモデルに辞書を挿入することです。あなたの辞書は静的であっても、アプリケーションロジック内の式を避けることさえできます。ただし、テストを実行するたびにディクショナリをクリアしないと、単体テストに影響します。

結論としては、任意のサービスまたは辞書を作成することをお勧めします。 静的に宣言された辞書を使用すると、単体テストはティアダウン段階で辞書をクリアする必要があります。そうしないと、以前実行したテストの副作用に基づいて他のテストが影響を受けます。

+0

ありがとう! ) – NoteStylet

+0

私はあなたの意図に同意しますが、テスト容易性の観点からは、アプリケーション全体で何を共有しているかによって大きく左右されます。私の例では 'MySharedClass'は、あなたが何らかのパターンを使ってコンストラクタにそれを注入しているのか、シングルトンのプロパティを使ってそれをアクセスしているのか、本当に問題ではありません。実際の質問は:あなたは' MySharedClass'をテストしていますか?依存関係、独立したものなど);-) – SushiHangover

+0

私は、アプリケーションロジックとビジネスロジックの依存関係になると思います。それがアプリケーションロジックなら、あなたが挙げたアプローチを好む。 –

関連する問題