虽然我的问题可能看起来很抽象,但我希望不是。假设我开发了一个应用程序,一个 ASP.NET MVC 站点,然后我的任务是为这个应用程序构建一个 Winforms 客户端,我可以从现有应用程序中重用多少以及如何重用?
我定义了模型,定义了控制器和视图。他们都运作良好。
现在老板来要求一个 Winforms 客户端,我希望我可以重用模型和控制器(前提是我将它们放在不同的程序集中),而不仅仅是重用视图(ASPX 视图)。
这可以做到吗?如何?
虽然我的问题可能看起来很抽象,但我希望不是。假设我开发了一个应用程序,一个 ASP.NET MVC 站点,然后我的任务是为这个应用程序构建一个 Winforms 客户端,我可以从现有应用程序中重用多少以及如何重用?
我定义了模型,定义了控制器和视图。他们都运作良好。
现在老板来要求一个 Winforms 客户端,我希望我可以重用模型和控制器(前提是我将它们放在不同的程序集中),而不仅仅是重用视图(ASPX 视图)。
这可以做到吗?如何?
我以前做过这个,不是用 asp.net MVC,而是用纯 asp.net web 表单。我使用了一个本土的 MVP(模型-视图-演示者)模式,并且允许在 WinForms 应用程序中使用演示者(== 控制器)的绝对最重要的事情是不引用与系统有关的任何内容.web
因此,您需要做的第一件事是引入接口来包装任何请求、响应、Web 等内容,并让每个 Presenter 通过依赖注入接受这些接口(或通过其他技术使它们对 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);
}
}
winform实现:
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 入门套件(不要被 Northwind 位推迟) - 它具有附加到分层架构的各种 GUI,包括 MVC 和 Winforms。
它完全符合您的要求。