如何将视图逻辑设计到c#项目中

如何将视图逻辑设计到c#项目中,c#,winforms,architecture,console,C#,Winforms,Architecture,Console,我的解决方案中有三个c#项目。一个是控制台应用程序,它只调用类库项目。类库项目完成应用程序的所有处理。然后是一个WinForm项目,它显示一个表单,然后当按下按钮时,调用类库项目中的相同逻辑。因此,有两种方法可以运行逻辑,通过控制台或Windows UI(WinForm) 我的问题是,在类库逻辑中,如果正在使用UI应用程序,我希望出现一个自定义WinForm表单来向用户提问 在控制台应用程序中,我希望在逻辑中的同一位置简单地写入控制台。在我对体系结构的理解中,您不希望类库项目包含WinForm逻

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

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

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


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

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

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

您可以在类库中引发一个事件,该事件从您的UI/控制台层侦听/注册。这样,如果你认为有必要在你想要的任何地方采取行动,它就可以决定采取行动。这实际上取决于您的体系结构是如何设置的。

您可以创建一个库定义的接口,以便与调用者通信,然后让两个调用应用定义自己的接口实现,库调用此接口上的方法,而对实现一无所知

调用方相应地处理这些方法

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!");
    }
}

您的逻辑永远不应该引用任何类型的UI组件。如果是这样,那就错了,您需要重新设计它以完全删除UI依赖项。

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

另一种解决方案

在你的课堂上

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

我会将其视为类库中的事件,并在UI代码中实现侦听器(无论是控制台还是Winforms).True-他应该查看依赖项注入,并查看各种现有平台,如StructureMap。事件处理程序必须回调到库中以设置返回结果,并且您需要等待响应才能继续,但它可以工作
Class.MyLibMethod(s=> Console.WriteLine(s));