多个项目Solution Object LifeTime

时间:2012-05-05 15:43:13

标签: c# lifetime

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

假设您有一个包含三个项目(A,B,C)的解决方案。项目C引用B,B和C引用A.B是入口点的位置。我在项目A中的一个类中有一个列表。它是这样的:

项目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?

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

亲切的问候,

1 个答案:

答案 0 :(得分: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???
      }
 }

这称为构造函数注入,它可以说是在相关类之间传递依赖关系的最佳方法。最后,您可以开始使用dependency injection框架来管理这些,但刚开始我会手动完成,直到您了解它正在做什么,然后继续使用框架为您完成。

当然,这可能不是您的确切方案。也许B和C都是由其他东西创造的。在这种情况下,您可以让该类将相同的ProcessDuration实例注入B和C(而不是让B创建C并传递实例)。

由于这是在Web服务中运行,因此您需要确保所有实例都是thread-safe,即多个线程之间没有共享类中的数据,如果是,则已经内置了一些锁定机制,以确保一次只有一个线程可以访问数据。如果您不确定自己在做什么,则需要避免使用静态实例来帮助确保线程安全。在你走得更远之前,对依赖注入和线程进行一些研究可能会有所帮助。