【问题标题】:How do I design View logic into c# projects如何将视图逻辑设计到 c# 项目中
【发布时间】:2010-01-12 16:06:47
【问题描述】:

我的解决方案中有三个 c# 项目。一个是控制台应用程序,它只是调用类库项目。类库项目为应用程序执行所有处理。然后是一个显示表单的 WinForm 项目,然后当按下按钮时,调用类库项目中的相同逻辑。因此,有两种方法可以运行逻辑,通过控制台或通过 Windows UI (WinForm)。

我的问题是类库逻辑的一部分,如果正在使用 UI 应用程序,我希望出现一个自定义 WinForm 表单来向用户提问。

在控制台应用程序中,我希望在逻辑中的相同位置简单地写入控制台。在我对架构的理解中,您不希望类库项目包含 WinForm 逻辑并要求它具有对所有 WinForm 引用的引用。但是如何调用 WinForms 项目(或其他)来显示自定义 WinForm 表单?将有一个循环引用,其中类库将引用主 WinForm 应用程序,而 WinForm 应用程序将引用类库项目。

这样做的标准方法是什么?

【问题讨论】:

  • 我认为它是您的类库中的一个事件,并在您的 UI 代码(无论是控制台还是 Winforms)中实现一个侦听器。

标签: c# winforms architecture console


【解决方案1】:

您可以创建一个您的库定义的接口以与调用者进行通信,然后让您的两个调用应用程序定义自己的此接口的实现,该库调用此接口上的方法并且对实现一无所知。

调用者相应地处理方法...

public interface IProgressReporter
{
       void ReportMessage(string message);
}



public class WinFormsProgressReporter : IProgressReporter
{
    public void ReportMessage(string message)
    {
          MessageBox.SHow(message);
    }
}

public class ConsoleAppProgressReporter : IProgressReporter
{
    public void ReportMessage(string message)
    {
          Console.WriteLine(message);
    }
}

public class LibraryClass
{
    public static void SomeMethod(IProgressReporter rep)
    {
         rep.ReportMessage("Wooooohooooo!");
    }
}

【讨论】:

    【解决方案2】:

    为什么不定义一个接口 IOutputHandler,它有一个名为 DisplayOutput 的方法。您将有 2 个实现,一个用于您的 winforms 应用程序,一个用于控制台。你会在运行时调用它的正确版本。您可以修改您的类库,为 IOutputHandler 提供一个私有字段实例,然后在运行时插入正确的实例。

    【讨论】:

    • 是的——他应该看看依赖注入,看看现有的各种平台,比如 StructureMap。
    【解决方案3】:

    您可以在类库中引发一个事件,该事件从您的 UI/Console 层监听/注册。这样,如果您认为在任意多的地方都认为有必要,它就可以决定对事件采取行动。这实际上取决于您的架构是如何设置的。

    【讨论】:

    • 事件处理程序必须回调到库中以设置返回结果,您需要等待响应才能继续,但它会起作用
    【解决方案4】:

    这是您需要在逻辑层和 UI 层之间进行明确定义的地方。将这种逻辑放在 UI 中是完全可以接受和正常的,因为该位不能合理地存在于逻辑层中,因为它依赖于 UI。

    【讨论】:

      【解决方案5】:

      您的逻辑应该永远引用任何类型的 UI 组件。如果有,那就错了,需要重新设计,彻底去除UI依赖。

      【讨论】:

        【解决方案6】:

        虽然接口答案可能是更好的解决方案,但如果它只是 一个 方法,您可以使用委托将 Console 或 WinForm 方法传递给类库。

        【讨论】:

          【解决方案7】:

          另一种解决方案

          在你的类库中..

          public void MyLibMethod(Action<string> callBack)
          {
                callBack("Yeh baby...");
          }
          

          然后调用

          Class.MyLibMethod(s=> Console.WriteLine(s));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-12
            • 1970-01-01
            相关资源
            最近更新 更多