Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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#_Circular Dependency - Fatal编程技术网

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中添加了其他实现一些特殊情况。