8

私の質問は抽象的に見えるかもしれませんが、そうでないことを願っています。アプリケーション、ASP.NET MVC サイトを開発し、後でこのアプリケーション用の Winforms クライアントを構築する任務を負ったとします。既存のアプリケーションからどの程度、どのように再利用できるでしょうか?

モデルを定義し、コントローラーとビューを定義しました。それらはすべてうまく機能します。

今、上司は Winforms クライアントを求めてきました。ビュー (ASPX ビュー) だけを再利用するのではなく、モデルとコントローラー (別のアセンブリに配置した場合) を再利用できることを望んでいます。

これはできますか?どのように?

4

2 に答える 2

10

私は以前、asp.net MVC ではなく、純粋な asp.net Web フォームでこれを行いました。私は自家製の MVP (Model-View-Presenter) パターンを使用しました。Presenter (== あなたの場合は Controller) を WinForms アプリで使用できるようにするための最も重要なことは、システムに関係するものを何も参照しないことでした。 。ウェブ

したがって、最初に行う必要があるのは、要求、応答、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 の実装を詳しく見ていませんが、これが、あなたが求めているシナリオを有効にするのはおそらく大変な作業になるということを示してくれることを願っています.

代わりに、異なるプラットフォーム用にビューとコントローラーを再コーディングする必要があることを受け入れることを検討し、代わりに、コントローラーを非常に薄く保ち、コードの大部分を共有可能なサービスレイヤーに配置することに集中することをお勧めします.

幸運を!

于 2008-09-23T22:58:17.720 に答える