消除循环依赖并创建对象
本文关键字:创建对象 依赖 循环 | 更新日期: 2023-09-27 18:26:44
我的解决方案中有三个项目
-
ClassLibrary=>引用接口库,UIProject包含(CountDownTimer.cs)
-
界面库包含(ICountDownTimer.cs)
- UIProject=>引用接口库包含(frmMain.cs,Controller.cs)
我读到添加接口是消除循环依赖的一种方法,我试图找到解决问题的方法,但一直没有找到。
我需要在控制器类中创建一个新的CountDownTimer对象,任何人都可以建议或帮助吗
public partial class frmMain : Form
{
//Reference to the Controller class, so we can call it
private Controller MController { get; set; }
//Constructor
public frmMain(Controller cntr)
{
MController = cntr;
InitializeComponent();
}
private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
//Because controller is the main class, closing the form won't exit the program
//So we need to close it with an exit call
Application.Exit();
}
private void btn_Start_Click(object sender, EventArgs e)
{
MController.StartTimer();
}
}
public class Controller : ApplicationContext
{
//Store a reference to the UI
internal frmMain MainUI { get; set;}
private ICountDownTimer timer;
public Controller()
{
MainUI = new frmMain(this);
MainUI.Show();
}
internal void StartTimer()
{
}
}
public class CountDownTimer : ICountDownTimer
{
private int seconds; // Time in seconds
private int reSetValue; // Time in seconds
private System.Windows.Forms.Timer timer1;
private Controller parent;
public CountDownTimer(Controller parent, int seconds)
{
this.parent = parent;
this.seconds = seconds;
reSetValue = seconds;
timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer1_Tick); // Add Handler(timer1_Tick)
timer1.Interval = 1000; // 1 second
//parent.TickUpdate(("" + seconds / 60).PadLeft(2, '0') + "m:" + ("" + seconds % 60).PadLeft(2, '0') + "s");
}
private void timer1_Tick(object sender, EventArgs e)
{
seconds--; // Decrement seconds
if (seconds == 0) // Stop Timer at 0
{
timer1.Stop(); // Stop timer
}
else
{
//parent.TickUpdate(convertSecondToMMSS());
if (seconds % 60 == 0 || seconds >= 1 && seconds <= 10)
{
//parent.TickUpdate(seconds);
}
}
}
void ICountDownTimer.StartTimer()
{
timer1.Start(); // Start Timer
}
public string convertSecondToMMSS()
{
TimeSpan t = TimeSpan.FromSeconds(seconds);
string str = string.Format("{0:D2}m:{1:D2}s",
t.Minutes,
t.Seconds);
return str;
}
void ICountDownTimer.StopTimer()
{
timer1.Stop();
}
void ICountDownTimer.ResetTimer()
{
timer1.Stop();
seconds = reSetValue;
//parent.TickUpdate(convertSecondToMMSS());
}
void ICountDownTimer.SetTimer(int seconds)
{
timer1.Stop();
this.seconds = seconds;
reSetValue = seconds;
//parent.TickUpdate(convertSecondToMMSS());
}
}
public interface ICountDownTimer
{
void StartTimer();
void StopTimer();
void ResetTimer();
void SetTimer(int seconds);
}
CountdownTimer应该对控制器一无所知。
控制器应该实例化和引用CountdownTimer,并相应地使用它的方法和输出,例如,它应该订阅定时器Tick事件处理程序,以正确的频率更新UI。
看看好莱坞原则,它使用了"不要给我们打电话,我们会给你打电话"的说法。将这个系统应用到您的场景中,意味着CountdownTimer不应该"调用"Controller,Controller应该"调用"CountdownTimer。在这个维基百科条目中,以下摘录完全适用于你正在做的事情:
实现这一点的关键是牺牲控制因素。系统运行您的程序在我们的例子中,我们的程序可以注册定时器事件,并编写相应的事件处理程序来更新坐标。该程序将包括对其他事件作出响应的其他回调,例如当系统需要重新绘制窗口的一部分时。这个系统应该提供合适的上下文信息,以便处理程序可以执行任务并返回。用户的程序不再包括显式控制路径,除了初始化和注册。
UIProject唯一关心的问题应该是管理UI。因此,它不应该包含可以是通用CountdownTimer类的实现。