相关疑难解决方法(0)

如何在 WinForms 客户端应用程序中使用命令模式?

背景

我正在构建一个两层的 C# .net 应用程序:

  1. 第 1 层:使用 MVP(模型-视图-演示者)设计模式的 Winforms 客户端应用程序。
  2. 第 2 层:位于实体框架和 SQL Server 之上的 WebAPI RESTful 服务。

如果您想了解我正在构建的应用程序的更多详细信息,我在这里给出的解释可能过于彻底。

当前发展

目前,我正在 Winforms 客户端上工作。特别是,我正在尝试在此客户端中散列命令模式的适当实现。我有幸偶然发现了这篇出色的博客文章,其中概述了一个可靠的命令架构。为了补充那篇文章,作者接着解释了他如何将查询与命令分开。阅读这些博客后,很明显我的第 2 层(Web api 服务)将从实现这两个中受益匪浅。通用实现允许极好的灵活性、可测试性和可扩展性。

我不太清楚的是我如何在 winforms 客户端(第 1 层)上实现这些模式。此处是否继续将查询和命令视为分开的?考虑一个基本操作,例如登录尝试。这是查询还是命令?最终,您需要从 Web 服务返回数据(服务器上的用户信息),因此我认为这是一个查询。另一种情况如何,例如创建新用户的请求。我知道您将创建一个命令对象来存储用户信息并将其发送给服务。命令应该是即发即忘,但您是否不想从服务中获得某种命令是否成功的确认?此外,如果命令处理程序返回 void,

归根结底,对于任何给定的 UI 任务(比如用户创建请求),是否最终会得到一个基于 winforms 客户端的查询/命令,以及命令/查询的 web api 服务版本哪个处理那方面的请求?

.net c# winforms simple-injector asp.net-web-api

5
推荐指数
1
解决办法
2006
查看次数

Winforms:如何使用IoC容器注册表单

背景

我正在构建一个winforms应用程序,我正在使用IoC容器(SimpleInjector)来注册我的类型.在我的应用程序中,大多数屏幕(即表单)在任何给定时间只有一个实例.

问题

对于在任何给定时间只需要一个实例的表单,我可以将它们注册为单例:

container.Register<IHomeView, HomeView>(Lifestyle.Singleton);
Run Code Online (Sandbox Code Playgroud)

这允许我使用容器来跟踪所有表单.但是,在这种情况下,当表单被关闭时,它将被释放(表单实现IDisposable).如果应用程序尝试使用容器再次打开该表单,则将处置该表单的容器实例,并抛出异常.

处理这个问题的正确方法是什么?我目前看到两种解决方案:

  1. 对于每个表单,覆盖表单接近隐藏表单,而不是实际关闭它.我真的不喜欢这个主意.我觉得我每次都要关闭表格,然后从一个新的/新的表格开始.
  2. 使用短暂的生活方式注册表单而不是单身.在这种情况下,容器实际上更像是一个工厂.我遇到两个问题:a)我失去了通过容器跟踪表单的能力,并且,b)容器在验证期间抛出异常,说一次性类型不应该被注册为瞬态(我不明白为什么这是).这些问题都适用于我同时需要多个实例的表单.

我可以通过在验证期间抑制诊断警告来解决问题b).

registration = container.GetRegistration(typeof(ILoginView)).Registration;
registration.SuppressDiagnosticWarning(
    DiagnosticType.DisposableTransientComponent,
    "Winforms registration supression.");
Run Code Online (Sandbox Code Playgroud)

在这里采取正确的方法是什么?我错过了什么吗?

.net c# inversion-of-control winforms simple-injector

4
推荐指数
1
解决办法
4045
查看次数