sha*_*ond 4 c# architecture oop dependency-injection software-design
我在这里遇到一种情况,我的类中需要一个计时器,它根据时间间隔调用一些方法。
在正常情况下,我会实例化计时器并在构造函数本身中配置它。但我想以依赖注入的方式做到这一点。在构造函数中传递计时器很容易,但为了将方法绑定到其 OnTimeElapsed 很棘手,实例化该类的工厂是否应该配置此计时器?我应该如何继续而不违反依赖注入原则。
谢谢
编辑1
好吧,让我重新表述一下我真正想问的问题。我实现依赖注入的主要目标是,我需要在特定的运行时间内对方法是否被调用进行单元测试。
所以我的问题是:我应该在哪里绑定 OnTimerElapsed 事件?我真的想在这里测试计时器吗?我似乎在这里迷路了
请帮忙。
如果您的问题是,您想要依赖注入一个计时器,稍后可以将事件绑定到该计时器,那么它应该很简单。
只需创建您的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,而且我们也不关心。将其留给计时器的创建者,我们只需要一种方法来完成任务,这就是上面的代码演示的内容。