【问题标题】:Drawbacks of instantiate WinForm inside an ASP.NET MVC controller method在 ASP.NET MVC 控制器方法中实例化 WinForm 的缺点
【发布时间】:2020-02-06 07:58:54
【问题描述】:

如标题中所述,我正在处理一个遗留的 ASP.NET MVC 项目,在该项目中我发现了一个非典型逻辑。 有时在后端,很少有私有方法(在某些情况下由某些控制器调用)实例化整个 WinForm(来自另一个引用为 .dll 的项目)以重用该逻辑(该 WinForm 的公共方法)。

我非常担心这一点以及这种架构的影响,但我不知道这种方法的任何真正缺点,而且我的重构预算非常有限。

所以我想问一下,这是否是一个需要解决的问题,或者这只是一种没有真正缺点的奇怪方法。

----EDIT : 添加示例代码

public ActionResult ShowPurcheaseorderById (int poId)
{
    PurcheaseOrderBiz po = new PurcheaseOrderBiz();
    return PartialView(po.GetById(poId));
}

商务类

public PurcheaseOrder GetById ( int poId )
{
    //some code here
    if ( _userNeedToKnowSomething )
    {
        NotificationHelper.NotifyToUser(message);
    }
}

在静态助手类中

public static void NotifyToUser ( string message )
{
    frmWarning wrn = new frmWarning();
    wrn.Message = message;

    wrn.Show();
}

我想强调的是,这只是一个示例(所以是虚构的代码)真实案例要复杂得多;但我希望能给你这个想法。

当我使用附加到 IIS 的调试器运行它时,一个页面返回它的内容(与 frmWarning 无关,为了简单起见,它就像是 PO 的图像一样)并且我的页面上显示了一个小 WinForm桌面(显示消息)

【问题讨论】:

  • 我有点迷路了——这到底是怎么工作的?当然,这只适用于开发?如果您的意思是您使用的是单一方法,那么不,您应该将其提取到可重用的 DLL 中。
  • 我也对此感到困惑,但我有第二个项目(由 ASP.NET MVC 引用),其中包含所有 winform 依赖项。当那个奇怪的“模式”发生时,我的调试机器上会出现一个真正的 winform(我想当使用 NETWORK_SERVICE 作为 app_pool 用户部署时,情况可能会有所不同)。在我的调试机器中,我仍然从 VisualStudio 开始,处于调试模式(使用 iis express)
  • 这不是好的做法,需要的业务逻辑应该与 WinForm 分离。但是如果您有预算问题并且现在不能这样做,请确保: - winform 实例中的所有资源都已正确处理。 - 如果任何频繁和常见的代码对最终用户有严重的性能问题,至少将其从 winform 中删除。
  • 你能和我们分享一些代码sn-ps吗?它是如何实例化 WinForm 的?它如何“呈现”表单?
  • @Nenad 在静态方法中(在引用的项目中,不是 ASP.NET MVC 之一,而是在控制器中由它调用)有一个“_ref = new CustomDialogForm()”,然后是一个“ _ref.Show()"。目前,这些指令(在使用 IIS Express 调试中)在我的桌面机器(是开发/测试专用机器)上显示一个表单。 PS:对不起,如果我不透露任何代码,但代码本身没有非典型或奇怪的地方,而且我更愿意不透露该公司软件的任何部分。

标签: c# asp.net winforms


【解决方案1】:

我制作了一个示例 MVC 应用程序,它获取 Winforms 应用程序的某些属性,该属性仅在单击表单上的某个按钮时出现。

在我的本地机器上运行 MVC 应用程序时,每次请求 MVC Action 时都会呈现 Winform:

在 IIS 服务器上运行相同的应用程序时,似乎没有呈现窗口 - 但这可能是因为它在 IIS 用户帐户下运行,如问题中所述。

一种解决方案可能是确保在 MVC 控制器中处理不再需要的表单:

public ActionResult Index()
{
    string dataFromTheWinform = null;
    using (MyWinformsApp.Form1 temp = new MyWinformsApp.Form1())
    {
        temp.Show();
        temp.button1.PerformClick();
        dataFromTheWinform = temp.GetMyString();
        temp.Close();
    }

    ViewBag.MyString = dataFromTheWinform;

    return View("Index");
}

Form 仍然呈现,但在响应发送到客户端之前关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多