2010-12-13 14 views
2

wpfの機能のいくつかをテストして試してみるために、サンプルアプリケーションを作成しました。私は基本的にwpfでデータバインディングを試していましたが、残りの部分は多かれ少なかれ迅速に処理しました。その後、私はarquitecturalの問題に直面しました(はい、コーディングを開始する前に事前に考えていたはずです)。そして、私はそれに対して最高のリファクタリングソリューションが何かを知りたいと思っていました。インタフェースの実装と拡張性に関するアーキテクチャ上の質問

私は定義されたプロセスに基づいてオブジェクトのリストを返す単純なインターフェースを持っています。

public interface IDoStuff<out T> 
    { 
     IEnumerable<T> Do(string someParam); 
     } 

私はこのインターフェイス用に2つの実装を作成しました。それから私はMYOBJSにATER

foreach (var item in new IDoSTuffImplementation1()<MyObj>.Do("imp 1")) 
{ 
    MyObjs.Add(item); 
} 

をハードコードされた値とドロップダウンを持っているWPFのビューを持っている、とあなたが選択した内容に応じて、インタフェースの実装をinstatiatesといくつかのリストを移入し、リストビューのためのDataContextです物事などを表示しますが、主な質問からは外れています。

これはすべてハードコードされており、あまりうまくありません。私は新しいインターフェイスを実装する必要があった場合は、ドロップダウンリストに追加して、その特定の実装(新しいコードを複写する)のために新しいforeachを作成する必要があります

これは良い/拡張性のために。 wpfビューをview + viewmodelにして、ある種のMVVMパターンを使用するのが良いアプローチだと思っていました。 viewmodelは、(xmlによって)インターフェイスの特定の実装をインスタンス化し、それをviewmodelに注入して、その "Do"メソッドと誰もが幸せになるという春のような何らかのIoCを使用します。このように、新しいコンポーネントを実装するときに唯一必要となるのは、xml configファイルに追加することだけです。 提案、コメント?もしあれば、最善のアプローチは何ですか? ありがとうございます!

答えて

0

MethodPropertyに変更することをお勧めします。そして、そのプロパティをComboBoxItemsSourceプロパティに割り当てて、データバインディングを使用してコーディングを容易にします。

+0

これは本当に多くの助けにはならない、私の主な質問は、アーキテクチャ(と提案されたエンハンスメント)、データバインディングを作成する方法ではないと見なされます。 –

+0

MVVMについて言及したので、私はあなたに 'Method'の代わりに' Property'を使うことを提案しました。 MVVMは、「通知」、「データバインディング」、「コマンド」に基づいています。 'IoC'として' Unity'や 'MEF'を使います。 – decyclone

1

実際に、インターフェイスの別の実装を提供しても、アーキテクチャの変更は表示されません。 MVVMを使用するときは、既に優れたアーキテクチャを持っています。したがって、達成しようとしているタスクはアーキテクチャを変更することはありませんが、アーキテクチャを使用してアプリケーションを拡張します。

+0

はい、現在のケースでは、コンストラクタはIWorker を取得します。提案されたシナリオでは、コマンドに基づいて適切な実装を切り替えるためにDictionary >などのものが必要です。しかし、ここでは、私は非常にボタンのコマンドやスイッチのステートメントのいずれか、またはどの実装を適用する必要があるかを確認するには、そのスイッチを行うためのいくつかのコードがあります。私はmvvmのアイデアは、とりわけ、これを回避しようとしていると思いますか? –

+1

hmm ... VM内のIWorkerオブジェクトを追跡し、CommandParameterを使用してボタンのIWorkerを識別できるかどうかを確認します。すべてのIWorkerの実装を維持するというアイデアがうまくいかない場合は、コードビハインドでVMを初期化し、IWorkerオブジェクトの配列を受け入れるVMコンストラクタを作成することができます。 – Davita

関連する問題