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

时间:2010-01-12 16:06:47

标签: c# winforms architecture console

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

我的问题是通过类库逻辑的一部分,如果正在使用UI应用程序,我想要一个自定义的WinForm表单来询问用户一个问题。

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

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

7 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您可以创建一个您的库定义的接口,以便与调用者进行通信,然后让您的调用应用程序定义他们自己的接口实现,该库调用此接口上的方法,并且不了解任何实现。

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

另一种解决方案

在你的班级中..

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

然后致电

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