私はGUIと作業コードを分ける方法を知りたいと思います。 以下のような人為的なコード例は、考え方を網羅していると考えられる最小の開始点です。 C#ワークロジックから別のGUI
この例では、コマンドのソースとしてWindowsフォームを使用し、ディスプレイには (コンシューマ)の結果を使用しています。私は、作業コードがコマンドラインインターフェースからコマンドを得ることができるようにしたい。作業コードは、フォームの知識に依存するべきではありません。 Formは作業コードについてほとんど知っていないはずです。私は、いくつかの消費者が作業コード内のプロパティが値を変更するときに「参照」したいと思います。
私は、コミュニケーションのためのイベント、おそらくはインターフェースを使用していると思いますが、私は何かを開いています。
そこには数多くの提案があります。私はデザインパターンの本を読んできました。私は多くを試してきましたが、私が完全に実装できるほど十分に説明されたセットをまだ見つけていません。
私は普遍的な解決策を望んでいません。小規模で個人的なプロジェクトのために、できるだけ簡単に実装し、維持するために、 がほしいです。私は大きな企業のために設計していません。 私が見つけた
ほとんどのソリューションは、何をすべきかをほのめかすが、イベントが宣言された場合のような 詳細をカバーしていない、そしてそれはどちらかできる問題ので、どのようにコードの他 作品は、イベントの存在を見つけ出します イベントまたはイベントに応答します。私はいつもどこかで、何かを一緒につなぐためのグローバル変数になる必要があります。
ここで私の質問に最も近いのは、これが私の質問です。これはC# Windows Forms App: Separate GUI from Business Logicですが、このソリューションはフォームを使用してワーカーのインスタンスを作成し、興味のあるオブザーバに通知するのではなく、直接値を返します。提供されたソリューションは、2つのクラスを密接に結びつけました。インタフェースおよび反射でいくつか本当にクール作業を行いhttps://www.codeproject.com/Articles/14660/WinForms-Model-View-Presenter が、あまりにも保守性や柔軟ないないようでした:
私はどこでも見つけた最も近いソリューション
はこれです。以下のソースコードのコメント行には、目的の対話 が表示されますが、実装はされていません。
ファイル#1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// tell an instance of JustCounts to increment by 10
}
// Here, allow JustCounts to cause a call to this (or something
// similar, perhaps a property) to inform this code that the TotalCount
// property has changed.
public void ShowNewTotalCount(int NewTotal)
{
Console.WriteLine("New Total Count = {0}", NewTotal);
}
}
ファイル#2
class JustCounts
{
private int m_TotalCount = 100;
// Inform other classes when the following property changes value,
// preferably including the value in the notification.
public int TotalCount { get => m_TotalCount; }
// The code in File #1 needs to result in a call to this method
// along with the correct argument value.
public void AddThisMuch(int increment)
{
m_TotalCount += increment;
}
}