我承认我是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?
任何紧急帮助将不胜感激。如果我需要阅读一些区域以更好地了解这些情况,请告诉我......但首先要解决!
亲切的问候,
答案 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,即多个线程之间没有共享类中的数据,如果是,则已经内置了一些锁定机制,以确保一次只有一个线程可以访问数据。如果您不确定自己在做什么,则需要避免使用静态实例来帮助确保线程安全。在你走得更远之前,对依赖注入和线程进行一些研究可能会有所帮助。