MVC アーキテクチャを再利用します。2 つの UI レイヤーがあります。ASP.NET MVC および .NET Winforms
-
02-07-2019 - |
質問
私の質問は抽象的に見えるかもしれませんが、そうでないことを願っています。アプリケーション、ASP.NET MVC サイトを開発し、その後、このアプリケーション用の Winforms クライアントを構築するタスクを任されたとします。既存のアプリケーションからどの程度、どのように再利用できるでしょうか?
モデルを定義し、コントローラーとビューを定義しました。それらはすべてうまく機能します。
ここで、上司が Winforms クライアントを求めてきました。ビュー (ASPX ビュー) だけを再利用するのではなく、モデルとコントローラー (別のアセンブリに配置する場合) を再利用できることを期待しています。
これはできるでしょうか?どうやって?
解決
以前、asp.net MVCではなく、純粋なasp.net Webフォームを使用してこれを実行しました。私は独自の MVP (Model-View-Presenter) パターンを使用しましたが、WinForms アプリで Presenter (== コントローラー) を使用できるようにする上で最も重要なことは、参照しないことです。 何でも system.webとの関係
したがって、最初に行う必要があるのは、リクエスト、応答、Web などをラップするインターフェイスを導入し、すべてのプレゼンターが依存関係の注入を介してこれらのインターフェイスを受け入れるようにすることです (または、他の手法でプレゼンターがインターフェイスを利用できるようにする)。プレゼンターが実際の system.web のものではなくそれらを使用する場合。
例:
ページ A からページ B にコントロールを移したいとします (winforms アプリでは、フォーム A を閉じてからフォーム B を開きたい場合があります)。
インターフェース:
public interface IRuntimeContext
{
void TransferTo(string destination);
}
ウェブ実装:
public class AspNetRuntimeContext
{
public void TransferTo(string destination)
{
Response.Redirect(destination);
}
}
winforms の実装:
public class WinformsRuntimeContext
{
public void TransferTo(string destination)
{
var r = GetFormByName(destination);
r.Show();
}
}
次に、プレゼンター (あなたの場合はコントローラー) は次のようにします。
public class SomePresenter
{
private readonly runtimeContext;
public SomePresenter(IRuntimeContext runtimeContext)
{
this.runtimeContext = runtimeContext;
}
public void SomeAction()
{
// do some work
// then transfer control to another page/form
runtimeContext.TransferTo("somewhereElse");
}
}
私は asp.net MVC の実装を詳しく見ていませんが、目的のシナリオを有効にするのにおそらく多大な作業が必要であることが少しでもわかっていただければ幸いです。
代わりに、さまざまなプラットフォームに合わせてビューとコントローラーを再コーディングする必要があることを受け入れ、コントローラーを非常に薄く保ち、コードの大部分を共有可能なサービス層に配置することに集中することを検討することをお勧めします。
幸運を!
他のヒント
を見てください。 ノースウィンド スターター キット (Northwind のことを気にしないでください) - これには、MVC と Winforms の両方を含む階層化されたアーキテクチャに接続されたさまざまな GUI があります。
それはまさにあなたが達成したいことを実現します。