1

我承认我是 C# 的新手,我有以下问题。

假设您有一个包含三个项目(A、B、C)的解决方案。项目 C 引用 B,B 和 C 都引用 A。B 是入口点所在的位置。我在项目 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 服务应用程序,所以几个连接可能正在迭代列表,所以我无法在一次运行后清除它。

你有什么建议?我该如何解决这个问题?我也想知道如何在垃圾收集器之前销毁对象TD?

任何紧急帮助将不胜感激。如果我需要阅读某些领域以更好地了解这些情况,请告诉我......但首先要解决!

亲切的问候,

4

1 回答 1

0

B创造C吗?如果是这样,让 B 在创建时将 ProcessDuration 的实例提供给 C 的构造函数。更好的办法是通过它的构造函数向 B 提供 ProcessDuration,以便每个类都可以使用模拟或假 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 服务中运行的,因此您需要确保所有实例都是线程安全的,即,类中的数据不会在多个线程之间共享,或者,如果是,您已经内置了一些锁定机制,以确保一次只有一个线程可以访问数据。如果您不确定自己在做什么,您将希望避免使用静态实例来帮助确保线程安全。在进一步研究之前,对依赖注入和线程进行一些研究可能会有所帮助。

于 2012-05-05T15:53:01.847 回答