我的解决方案中有三个c#项目。一个是控制台应用程序,只需调用类库项目。类库项目执行应用程序的所有处理。然后有一个WinForm项目显示一个表单,然后当按下一个按钮时,调用类库项目中的相同逻辑。因此,有两种方法可以通过控制台或Windows UI(WinForm)运行逻辑。
我的问题是通过类库逻辑的一部分,如果正在使用UI应用程序,我想要一个自定义的WinForm表单来询问用户一个问题。
在控制台应用程序中,我希望逻辑中的相同位置可以简单地写入控制台。在我对架构的理解中,您不希望类库项目包含WinForm逻辑,并要求它引用所有WinForm引用。但是如何调用WinForms项目(或其他东西)来显示自定义WinForm表单?将有一个循环引用,其中类库将引用主WinForm应用程序,WinForm应用程序将引用类库项目。
这样做的标准方法是什么?
答案 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));