1

私は C# の初心者であることを認め、次の質問があります。

3 つのプロジェクト (A、B、C) を持つソリューションがあるとします。プロジェクト C は B を参照し、B と C の両方が A を参照します。B はエントリ ポイントの場所です。プロジェクト A 内のクラスの 1 つにリストがあります。次のようになります。

プロジェクト A:

public class ProcessDuration
    {
        public List<TicketTimer> DurationList = new List<TicketTimer>();

        public void AddProcesstime(string Ticket, int Count, Process_Step Step, Process_Status Status, DateTime Time)
        {
            Ticket ccStart = new Ticket();
            ccStart.RecordTime(Ticket, Count, Step, Status, Time);
            DurationList.Add(ccStart);
        }
...
}

プロジェクト B:

class testB
{
          public TicketProcessDuration TD = new TicketProcessDuration();
          TD.StartProcessMonitor(ticketMain, request.DataRecords.Count);
}

プロジェクト C:

class testC
{
        TD.StartProcessMonitor(ticketMain, request.DataRecords.Count); //Error here because TD scope
}

プロジェクト B と C からリストに追加したいので、B 内に ProjectDuration クラスのオブジェクトを作成します。しかし、プロジェクト C からはスコープの関係でアクセスできません。リストを静的にして、プロジェクト C でオブジェクト TD を作成してみましたが、別の問題が発生しました。アプリの有効期間のリストを維持しますが、実行ごとにリストを空にしたいのです。関数を定義して ProjectDuration オブジェクトを B から C に渡したくありません。また、これが Web サービス アプリケーションであることもわかっているため、複数の接続でリストが繰り返される可能性があるため、1 回の実行後にクリアすることはできません。

何をアドバイスしますか?この問題を解決するにはどうすればよいですか? また、ガベージ コレクターの前にオブジェクト TD を破棄する方法を知りたいですか?

緊急の助けをいただければ幸いです。これらの状況をよりよく理解するためにいくつかの分野を読む必要があるかどうか教えてください...しかし、最初に解決策を!

敬具、

4

1 に答える 1

0

B は C を作成しますか? その場合、C を作成するときに B が ProcessDuration のインスタンスを C のコンストラクターに提供するようにします。各クラスをモックまたは偽の ProcessDuration でテストできるように、コンストラクターを介して B にも ProcessDuration を提供することをお勧めします。

  public class TestB
  {
      private TestC C { get; set; }
      private ProcessDuration TD { get; set; }

      public TestB(ProcessDuration td)
      {
           this.TD = td;
           this.C = new TestC(td);
      }

      public void DoSomething()
      {
           this.TD.StartProcessMonitor( ... );
           this.C.DoSomethingEsle();
      }
  }

  public class TestC
  {
      private ProcessDuration TD { get; set; }

      public TestC(ProcessDuration td)
      {
          this.TD = td;
      }

      public void DoSomethingElse();
      {
          this.TD.StartProcessMonitor(...);  // or just continue using it???
      }
 }

これはコンストラクター注入と呼ばれ、関連するクラス間で依存関係を渡すための最良の方法であることは間違いありません。最終的には、依存性注入フレームワークを使用してこれらを管理し始めることができますが、最初は、それが何をしているのかを理解するまで手動で行い、フレームワークを使用してそれを行うことに移ります.

もちろん、これはあなたの正確なシナリオではないかもしれません。おそらく、B と C の両方が別の何かによって作成されます。その場合、そのクラスに同じ ProcessDuration インスタンスを B と C の両方に注入させることができます (B が C を作成してインスタンスを渡すのではなく)。

これは Web サービスで実行されているため、すべてのインスタンスがスレッドセーフであることを確認する必要があります。つまり、クラス内のデータが複数のスレッド間で共有されていないか、共有されている場合は、いくつか一度に 1 つのスレッドのみがデータにアクセスできるようにするためのロック メカニズム。何をしているのかわからない場合は、静的インスタンスを使用してスレッドの安全性を確保することは避けてください。さらに先に進む前に、依存性注入とスレッド化の両方について調査することが役立つ場合があります。

于 2012-05-05T15:53:01.847 に答える