Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多项目解决方案对象生存期_C#_Lifetime - Fatal编程技术网

C# 多项目解决方案对象生存期

C# 多项目解决方案对象生存期,c#,lifetime,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(

我承认我是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);
        }
...
}
项目C:

class testC
{
        TD.StartProcessMonitor(ticketMain, request.DataRecords.Count); //Error here because TD scope
}
我想从项目B和C中添加到列表中。因此我在B中创建了一个ProjectDuration类的对象。但是由于范围的原因,我无法从项目C中访问它。我在ProjectC中尝试了使列表保持静态和创建对象TD,但这给了我另一个问题——它在应用程序生命周期中维护列表,但我希望在每次运行后清空列表。我不想定义一个函数,并将ProjectDuration对象从B传递给C。我还知道它是一个web服务应用程序,因此可能有多个连接在迭代列表,所以在一次运行后我无法清除它

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

任何紧急帮助都将不胜感激。让我知道,如果我需要阅读一些领域,以更好地了解这些情况。。。但解决方案是第一位的


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

如果B是入口点,不管这意味着什么——没有足够的上下文,而且似乎没有任何东西引用C,那么它是如何涉及的?我也不清楚跑步是什么。
  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???
      }
 }