通过依赖注入传递计时器并配置/启动计时器

sha*_*ond 4 c# architecture oop dependency-injection software-design

我在这里遇到一种情况,我的类中需要一个计时器,它根据时间间隔调用一些方法。

在正常情况下,我会实例化计时器并在构造函数本身中配置它。但我想以依赖注入的方式做到这一点。在构造函数中传递计时器很容易,但为了将方法绑定到其 OnTimeElapsed 很棘手,实例化该类的工厂是否应该配置此计时器?我应该如何继续而不违反依赖注入原则。

谢谢

编辑1

好吧,让我重新表述一下我真正想问的问题。

  1. 根据 Misko发布的视频
  2. 在他的其他演讲中(永远不要测试您的框架:此处的.net框架)
  3. 在他的代码审查指南中,除了构造函数中的字段分配之外所做的任何事情都被认为是不好的。

我实现依赖注入的主要目标是,我需要在特定的运行时间内对方法是否被调用进行单元测试。

所以我的问题是:我应该在哪里绑定 OnTimerElapsed 事件?我真的想在这里测试计时器吗?我似乎在这里迷路了

请帮忙。

Nib*_*Pig 6

如果您的问题是,您想要依赖注入一个计时器,稍后可以将事件绑定到该计时器,那么它应该很简单。

只需创建您的Timer类来遵循ITimer接口并在其上创建方法来执行您想要的操作。

public class Calendar
{
    public Calendar(ITimer timer)
    {
        // timer is the dependency injected timer
        timer.SetEvent(EventReminder, 3600);
    }

    public void EventReminder()
    {
        Console.Write("Hey, it's time for your appointment!");
    }

}

public interface ITimer
{
    void SetEvent(Action callbackMethod, int interval);
}
Run Code Online (Sandbox Code Playgroud)

在本例中,您有一个日历应用程序,并且您希望您的应用程序有一个计时器。但您并不关心计时器如何工作,甚至不关心计时器的类型(也许您想要一个按分钟或小时工作的计时器,或者以其他方式工作)。您只知道您需要一个计时器,因此您需要依赖注入一个计时器。

您必须创建一个接口,定义计时器将执行的操作,因为虽然它不关心您使用哪个计时器,但它确实关心功能计时器的在我们的例子中,计时器可以做一件事——设置一个事件在一定的时间间隔后发生。

因此,我们注入计时器,但为了能够使用它或设置它,我们使用接口来定义方法。我们永远不知道它内部是如何工作的——我们甚至不知道它有一个 OnElapsedEvent,而且我们也不关心。将其留给计时器的创建者,我们只需要一种方法来完成任务,这就是上面的代码演示的内容。