1

GUIモード(1つのプロジェクト)とコンソールモード(別のプロジェクト)を使用して.NETソリューションを構築しています。これらの各プロジェクトは、各アプリの背後にある共有論理ガッツを保持する共有クラスライブラリを参照します。DLLを各クライアントアプリケーションから可能な限り分離する必要があります。DLLレポートをGUIに進行させるにはどうすればよいですか?現在、GUIプロジェクトはDLLを参照しています。VS2010 / .NETでは、循環参照になるため、DLLからGUIを参照できません。

これどうやってするの?.NET設計、または一般的なソフトウェア設計でこれを処理する方法に関する一般的な原則はありますか?呼び出し元のプロジェクトを参照せずにコールバックを使用する方法はありますか?

4

3 に答える 3

1

循環参照を破る最も簡単な方法は、両方のモジュールが参照する別のライブラリを作成することです。

別のオプションは、ロジックDLLによって発生し、GUI/コンソール部分で処理できるイベントを使用することです。

于 2012-05-10T15:17:48.627 に答える
1

DLLにカスタムイベントが必要で、それをGUIでアタッチする必要があるように思えます。

わかりやすくするためのコードを次に示します。

まず、ロードと同様のことを行い、完了したパーセンテージを受け取ったGUIでアタッチできるイベントを定義するDLLのモックを作成しましょう。

public class MyDLLType
{
  public decimal PercentageComplete = 5;

  public event EventHandler<CustomEventArgs> StatusChanged;

  public virtual void OnStatusChanged(CustomEventArgs e)
  {
   if(StatusChanged != null)
   {
      StatusChanged(this, e);
   }
  }

  public void DoSomething()
  {

     var eventArgs = new CustomEventArgs();
     eventArgs.PercentageComplete = PercentageComplete;

     OnStatusChanged(eventArgs);

     if(PercentageComplete < 100)
     {
       Thread.Sleep(500);
       PercentageComplete++;
       DoSomething();
     }
  }
}

StatusChangedこれで、GUIがフックするイベントを公開するモックDL​​Lができました。これを利用した模擬GUIは次のとおりです。

public class MyGUI
{
void Main()
{
    var myNiceDLLType = new MyDLLType();
    myNiceDLLType.StatusChanged += UpdateStatusChange;
    myNiceDLLType.DoSomething();
}

public void UpdateStatusChange(object sender, CustomEventArgs e)
{
 var percentageComplete = e.PercentageComplete;
 Console.WriteLine(percentageComplete);
}
}

ビンゴ、私たちのGUIは、DLLがGUIについて何も知る必要なしに、DLLから完全なパーセンテージを受け取っています。

上で使用したCustomEventArgsは次のようになります。

public class CustomEventArgs : EventArgs
{
    public decimal PercentageComplete{get;set;}
}
于 2012-05-10T15:54:58.430 に答える
0

循環参照が必要な設計の場合、IMHO、必要に応じてコードのその部分を再設計する必要があります。

関連するコードをcodereview.stackexchange.comに配置することをお勧めします

于 2012-05-10T15:12:18.573 に答える