重用MVC结构;有两层UI:ASP.NET MVC和.NET Winforms

时间:2020-03-06 14:37:58  来源:igfitidea点击:

尽管我的问题似乎很抽象,但我希望不是。假设我开发了一个应用程序,一个ASP.NET MVC站点,后来又受命为该应用程序构建一个Winforms客户端,如何从现有应用程序中重用?

我定义了模型,定义了控制器和视图。他们都运作良好。

现在老板来要求Winforms客户端,我希望我可以重用模型和控制器(前提是我将它们放在不同的程序集中),而不能重用视图(ASPX视图)。

能做到吗?如何?

解决方案

我以前不是用asp.net MVC而是用纯asp.net Web表单完成此操作的。我使用了自己的MVP(模型-视图-演示器)模式,允许在WinForms应用中使用Presenter(在情况下为== Controller)的最重要的事情是不引用与系统有关的任何内容.web

因此,我们需要做的第一件事是引入用于包装任何请求,响应,Web等内容的接口,并让每个Presenter通过Dependency Injection接受这些接口(或者通过其他某种技术将其提供给Presenters),然后如果Presenter使用的是这些内容,而不是实际的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();
  }
}

现在是Presenter(在情况下为Controller):

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的实现,但是我希望这能给我们一些迹象,表明启用我们要使用的方案可能会花费很多工作。

相反,我们可能要考虑接受必须为不同平台重新编码View和Controller的想法,而要集中精力使控制器保持极薄并将大部分代码放在可以共享的服务层中。

祝你好运!

看一下Northwind入门套件(不要被Northwind所拖累),该套件具有连接到分层体系结构(包括MVC和Winforms)的各种GUI。

它正是我们想要实现的目标。