2012-03-15 6 views
14

WPFとASP.NET MVCアプリケーションの間で最も多くのモデルとロジックコードを共有するために使用できるアーキテクチャとパターンは何ですか?WPFとASP.NET MVCアプリケーションの間で最も多くのコードを共有するにはどうすればよいですか?

ここでは、2つのプレゼンテーションプロジェクトからデータエンティティを分離するだけではなく、ここでもう少しを達成しようとしています。より多くのものが共通している。どのような条件の下で表示されるかに関するUIロジック、必要なときなど、私が共有コードに保存したいと思っているもの。

ADDED:私のプレゼンテーションを促進するエンティティモデルとは独立したビューモデルの概念が本当に好きです。これらのアノテーションで使用されている注釈の一部は、MVC固有のアセンブリにありますが、実際にはWeb特有のメタデータはありません。 WPFビューにバインドするためのデータソースとしてMVCビューモデルを使用してみたいと思っています。このフロントの提案は、最も高く評価されます。

+0

私は同様の質問をしました[ここ](https://stackoverflow.com/questions/44528570/should-viewmodel-deal-directly-with-dto-or-it-is-ok-to-have-intermediate-clientm )。 ViewModelsの再利用は成功しましたか? – Tenek

答えて

6

私の個人的な好みの設定は1つのアダムに似ていますKingは上記のように提案しましたが、私はロジックDLLをWebプロジェクトの一部として保持するのが好きです。このパターンに従うCT Terminalというプロジェクトを実行します。私のTerminal.Domainプロジェクトにはすべてのアプリケーションロジックが含まれており、UIプロジェクトに何をすべきかを指示するための指示として機能するプロパティを持つCommandResultオブジェクトが返されます。 UIは完全に愚かであり、Domainプロジェクトによって指示された内容だけを処理します。

今、Adam Kingのアプローチに従って、私はそのドメインDLLをWPFアプリケーションに叩き込み、返されたCommandResultオブジェクトの指示に従ってUIをコード化します。しかし、私は別のアプローチを好む。私はJSON APIを公開するためにMVC 3 UIを書きました。このAPIは、どのアプリケーションでも使用できます。 JSON APIは、基本的に私のTerminal.DomainプロジェクトCommandResultオブジェクトのラッパーだったのでシンプルでした。返されるJSONの基本プロパティは同じです。このようにして、DLLではなく、このAPIを使用するWPFアプリケーションを作成します。今度は、内部アプリケーションロジックを少し変更したら、Webプロジェクトをライブサーバーにデプロイするだけです。 APIを使用するすべてのクライアントは自動的にこの新しいロジックを取得します。

明らかに、変更がAPIから返されるプロパティに影響する場合は、新しいクライアントコードのリリースが必要ですが、少なくとも内部ロジックの場合は、これを行う必要はありません。

+1

私はこのアプローチのようなものです。異なるプレゼンテーションプロジェクト間でデータエンティティを共有するだけでなく、 – ProfK

+0

"CT Terminal"リンクはもう動作しません。 – Tenek

+0

申し訳ありませんが、私はそのプロジェクトに何が起こったのか分かりませんが、その概念は[shotgun](https://github.com/chevex-archived/shotgun)という新しいnode.jsプロジェクトに複製されています。クラスライブラリの代わりにノードモジュールです。 – Chev

2

実際にこのトピックのRocky Lhotkaの書籍、ソフトウェア、ビデオが非常に役に立ちました。ここで彼のコンテンツにいくつかのリンクです:最も広く使用されているパターンの

http://www.lhotka.net/

http://channel9.msdn.com/Events/Speakers/Rockford-Lhotka

http://www.amazon.com/Expert-C-2008-Business-Objects/dp/1430210192/ref=sr_1_2?s=books&ie=UTF8&qid=1331834548&sr=1-2

+3

ここで質問される質問に特に適用されるものは何ですか? –

+0

Rockyには、モデルとビューモデル用の.NETライブラリがあり、非常にうまく動作します。彼のビデオで説明されているように、そのデザインは非常に再利用可能なコードに適していると思います。彼はWPF DependencyObjectプロパティモデルについて議論し、彼のライブラリにも同様のことを実装しています。私はそれがMSMVCにとって有用な機能だと思います。 – Brannon

+0

Lhotkaの* Professional VB6 Business Objects *は私が独立した開発者としてのキャリアを築いた聖書でした。 – ProfK

3

一つは、これは参照した、別々のDLLアセンブリのエンティティを持っているように見えます他のプロジェクトのそれぞれからまず第一に取るべききれいなルートとすることができ、WPFとASP.netの両方のために動作します

MVC 3つのスーツ非常にうまくリポジトリパターン、

1

実行する必要があるすべての操作を表すメソッドを持つインターフェイスを指定することによって、アプリケーションのサービスレイヤーを作成します。また、このサービス層では、アプリケーションで使用されるすべてのデータ型を定義します。これらのデータ型クラスには、操作ではなくプロパティのみが含まれている必要があります。これらのインターフェイスとクラスをアセンブリにまとめてください。このアセンブリは、Webアプリケーション、WPFアプリケーション、およびそれを実装するコード間で共有する必要があります。

最後に、この分離が完了したら、アプリケーションの内部構造を自由に開発し、UI操作(たとえば、xyzボタンをクリックするとどうなるか)をそれぞれのUIに委ねることができます。

脇に、WCFとWebサービスを介してサービスレイヤを公開することができます。これを使用して、javascript経由でWebブラウザから電話をかけることができます。あなたは、クライアント側の検証のようなことをすることができますまたはドロップダウンの人口のためのオンザフライで値を参照してください。すべてあなたの2つのアプリケーションの間でそれを再利用しながら。

1

明らかにしています。別のアセンブリでビジネスロジックとドメインモデルをカプセル化します。

プレゼンテーションレイヤーと共有UIビヘイビアに関しては、MVVM設計パラダイムが最も近く、WPF/XAMLではC#、ASP.NET MVC WebフロントエンドではJavascriptが実装されます。

ウェブフロントエンドでは、MicrosoftのSteve Sandersonによって書かれたhttp://knockoutjs.com/で、WPF(MVVM)のやり方に近づくことができます。ブラウザ用のMVVM。詳細については、http://www.asp.net/mvc/mvc4もチェックアウトしてください。

1

Web Apiを使用すると、WPFとWebアプリケーションの両方がWeb APIからサービスを使用できるようになります。 完了。

+0

私はこのアプローチが気に入っていますが、それはとてもシンプルでエレガントですが、特にデータの注釈と属性を使って検証と直列化を実施する場合は、主なデータモデルエンティティをWPFアプリケーションにどのように共有するのですか?各プラットフォーム専用のモデルクラスを再定義する必要がありますか?これは、異なるプラットフォームで同期してモデルを保持しなければならないので、WebAPIを使用することの利点をほぼ打ち破っているようです... – SelAromDotNet

1

Portable class librariesを試しましたか?これにより、データレイヤーを作成してASP.Net MVC、WPF、Windows Phone、Silverlightで使用することができます。

+0

あなた(または他の誰かがこれを読んでいる人)は、ポータブルクラスライブラリWebとWin8/WinPhone/WPFの両方をターゲットにしますか? WebappIを使用してWebから他のプラットフォームにフィードするというNPehrssonの提案が好きで、私のコメントについての追加の洞察もありがとう!どうもありがとう! – SelAromDotNet

関連する問題