簡體   English   中英

如何在C#項目中設計View邏輯

[英]How do I design View logic into c# projects

我的解決方案中有三個c#項目。 一個是控制台應用程序,它僅調用一個類庫項目。 類庫項目對應用程序進行所有處理。 然后是一個WinForm項目,該項目顯示一個表單,然后當按下按鈕時,在類庫項目中調用相同的邏輯。 因此,有兩種方法可以通過控制台或Windows UI(WinForm)運行邏輯。

我的問題是,在使用類庫邏輯的過程中,如果正在使用UI應用程序,則我希望自定義WinForm表單出現來向用戶提問。

在控制台應用程序中,我希望邏輯中的相同位置可以簡單地寫到控制台。 在我對體系結構的理解中,您不希望類庫項目包含WinForm邏輯,而要求它具有對所有WinForm引用的引用。 但是,如何調用WinForms項目(或其他方法)以顯示自定義WinForm表單? 將有一個循環引用,其中類庫將引用主WinForm應用程序,而WinForm應用程序將引用類庫項目。

這樣做的標准方法是什么?

為什么不定義一個接口IOutputHandler,它具有一個稱為DisplayOutput的方法。 您將有2種實現,一種用於winforms應用,另一種用於控制台。 您將在運行時調用正確的版本。 您可以修改您的類庫,使其具有IOutputHandler的私有字段實例,然后在運行時插入適當的實例。

您可以在類庫中引發一個事件,該事件可以從您的UI / Console層監聽或注冊。 這樣,如果您認為有必要,可以決定在事件中采取行動。 這實際上取決於您的體系結構是如何設置的。

您可以創建一個接口,庫將定義該接口以與調用方進行通信,然后讓兩個調用應用程序定義該接口自己的實現,該庫將調用此接口上的方法,而對實現一無所知。

調用者將相應地處理方法...

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組件。 如果是這樣,那是錯誤的,您需要重新設計它以完全刪除UI依賴項。

雖然接口答案可能是更好的解決方案,但如果僅是一種方法,則可以只使用委托將Console或WinForm方法傳遞給類庫。

另一種解決方案

在你的類庫中

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

然后打電話

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM