C# 消除循环依赖并创建对象
我的解决方案中有三个项目C# 消除循环依赖并创建对象,c#,circular-dependency,C#,Circular Dependency,我的解决方案中有三个项目 ClassLibrary=>引用接口库,UIProject 包含(CountDownTimer.cs) 接口图书馆 包含(ICountDownTimer.cs) UIProject=>引用接口库 包含(frmMain.cs、Controller.cs) 我已经读到添加接口是消除循环依赖的一种方法,我曾试图找到我的问题的答案,但一直没有找到答案 我需要在控制器类中创建一个新的倒计时对象,是否有人可以提供建议或帮助 public partial class frmMai
- ClassLibrary=>引用接口库,UIProject 包含(CountDownTimer.cs)
- 接口图书馆 包含(ICountDownTimer.cs)
- UIProject=>引用接口库 包含(frmMain.cs、Controller.cs)
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);
}
公共部分类frmMain:Form
{
//引用控制器类,因此我们可以调用它
专用控制器MController{get;set;}
//建造师
公共财务总监(财务总监)
{
MController=cntr;
初始化组件();
}
私有void frmMain_FormClosed(对象发送方,FormClosedEventArgs e)
{
//因为controller是主类,所以关闭表单不会退出程序
//所以我们需要通过一个退出呼叫来结束它
Application.Exit();
}
私有无效btn\u开始\u单击(对象发送者,事件参数e)
{
MController.StartTimer();
}
}
公共类控制器:ApplicationContext
{
//存储对UI的引用
内部frmMain MainUI{get;set;}
专用ICountDownTimer定时器;
公共控制员()
{
MainUI=新的frmMain(本);
MainUI.Show();
}
内部空隙起始点()
{
}
}
公共类倒计时:ICountDownTimer
{
private int seconds;//以秒为单位的时间
private int reSetValue;//时间(秒)
private System.Windows.Forms.Timer timer1;
私有控制器父级;
公共倒计时(控制器父级,整数秒)
{
this.parent=parent;
这个。秒=秒;
重置值=秒;
timer1=new System.Windows.Forms.Timer();
timer1.Tick+=neweventhandler(timer1\u Tick);//添加处理程序(timer1\u Tick)
timer1.Interval=1000;//1秒
//parent.TickUpdate(“”+seconds/60).PadLeft(2,'0')+“m:”+(“”+seconds%60).PadLeft(2,'0')+“s”);
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
秒--;//递减秒数
if(seconds==0)//在0处停止计时器
{
timer1.Stop();//停止计时器
}
其他的
{
//parent.TickUpdate(convertSecondToMMSS());
如果(秒数%60==0 | |秒>=1&&seconds倒计时器应该不知道控制器
控制器应实例化并引用倒计时计时器,并相应地使用其方法和输出,例如,它应订阅计时器滴答事件处理程序,以正确的频率更新UI
请看使用“不要呼叫我们,我们将呼叫您”语句的。将此语句应用于您的场景,意味着倒数计时器不应“呼叫”控制器,控制器应“呼叫”倒数计时器。在此Wikipedia条目中,以下摘录完全适用于您正在做的事情:
实现这一点的关键是牺牲控制因素。
系统运行的不是运行系统的程序,而是
在我们的示例中,我们的程序可以注册计时器事件,
并编写相应的事件处理程序来更新坐标。
该计划将包括响应其他事件的其他回调,
例如,当系统要求重新绘制部分窗口时
系统应提供适当的上下文信息,以便处理程序能够
执行任务并返回。用户程序不再包含
显式控制路径,除了初始化和注册
UIProject唯一关心的应该是管理UI。因此它不应该包含可以是通用倒计时类的实现。我在这里可能是少数,但我从来没有理由将接口与它们的实现放在一个单独的项目中,除非ce中添加了其他实现一些特殊情况。