C# 多项目解决方案对象生存期
我承认我是C的新手,我有以下问题 假设您有一个包含三个项目a、B、C的解决方案。项目C引用B,B和C引用a。B是入口点所在的位置。我在项目a中的一个类中有一个列表。它是这样的: 项目A: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(
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???
}
}