项目中有这样一个需求:
每隔一段时间模拟发生一个事件,事件发生后有两种处理方式,二选一:
1,将事件内容储存到数据库,并将内容打包拷贝到指定共享文件夹;
2,事件内容不储存到数据库,直接发送到指定API;
使用接口实现过程:
0、TestEvent事件类:
public class TestEvent
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 发生时间
/// </summary>
public string BeginTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public string FinishTime { get; set; }
}
1、定义一个接口,即发布事件的方法:
interface IPublishMode
{
/// <summary>
/// 发布事件
/// </summary>
/// <param name="te"></param>
void Publish(TestEvent te);
}
2、定义两个类来实现接口,即上面提到的处理事件的两个方法:
(1)功能1-储存到数据库:
/// <summary>
/// 存储到数据库
/// </summary>
public class SaveInDatabase : IPublishMode
{
public void Publish(TestEvent te)
{
SaveXXX(te);
}
/// <summary>
/// 举个例子,需要用到的方法,实际可能有多个
/// </summary>
/// <param name="te"></param>
private void SaveXXX(TestEvent te)
{
//.......
Console.WriteLine("存储到数据库");
}
}
(2)功能2-发送到服务:
/// <summary>
/// 发送到服务
/// </summary>
public class SendToServer : IPublishMode
{
public void Publish(TestEvent te)
{
SendXXX(te);
}
/// <summary>
/// 举个例子,需要用到的方法,实际可能有多个
/// </summary>
/// <param name="te"></param>
private void SendXXX(TestEvent te)
{
//.......
Console.WriteLine("发送到服务");
}
}
3、调用接口,实现功能。
这里先声明一个接口字段,然后需要用哪个功能,就在构造函数中实例化哪个。
public class Simulate
{
private Timer _tim;
/// <summary>
/// 声明一个接口字段,需要用哪个功能就在构造函数中实例化哪个
/// </summary>
private IPublishMode _publish;
public Simulate()
{
_tim = new Timer();
_tim.Elapsed += _tim_Elapsed;
//需要用到哪个功能就实例化哪个,比如这里就用将事件存储到数据库的功能
_publish = new SaveInDatabase();
}
/// <summary>
/// 开始模拟
/// </summary>
public void Start()
{
_tim.Interval = 1000;
_tim.Start();
}
private void _tim_Elapsed(object sender, ElapsedEventArgs e)
{
TestEvent te = CreateEvent();
//将事件存储到数据库
_publish.Publish(te);
}
/// <summary>
/// 生成事件
/// </summary>
/// <returns></returns>
private TestEvent CreateEvent()
{
TestEvent te = new TestEvent();
//一些操作......
return te;
}
}