当某些预订发生更改时,我希望所有参与的人都能收到有关更改的邮件。
实际上我不确定如何完成这项工作。但我想我的第一个问题应该是。我应该如何检查更改是否一致,以及我应该如何知道哪些人参与了更改?
我在 MVC 3 中使用实体框架(延迟加载)。
当某些预订发生更改时,我希望所有参与的人都能收到有关更改的邮件。
实际上我不确定如何完成这项工作。但我想我的第一个问题应该是。我应该如何检查更改是否一致,以及我应该如何知道哪些人参与了更改?
我在 MVC 3 中使用实体框架(延迟加载)。
三角洲,
这可以通过多种方式解决。我今天使用的是基于在存储库保存更改时引发事件。不确定您的配置是什么样的,但这是我所做的一个片段:
public void SaveChanges()
{
//_auditDate = DateTime.Now; ignore this in your case
OnSavingChanges();
_context.SaveChanges();
OnSavedChanges();
}
private void OnSavingChanges()
{
if (SavingChanges != null)
{
var eventArgs = new RepositorySavingChangesEventArgs()
{
AuditDate = _auditDate
};
SavingChanges(this, eventArgs);
}
}
public event EventHandler<RepositorySavingChangesEventArgs> SavingChanges;
private void OnSavedChanges()
{
if (SavedChanges != null)
{
var eventArgs = new RepositorySavedChangesEventArgs()
{
AuditDate = _auditDate
};
SavedChanges(this, eventArgs);
}
}
public event EventHandler<RepositorySavedChangesEventArgs> SavedChanges;
然后简单地确保您的客户端代码订阅了 SavingChanges EventHandler。任务完成。您实际上只在您知道关键更改所在的上下文中订阅,然后在该事件处理程序内触发电子邮件服务调用。
希望这可以帮助。
[编辑]作为对下面评论的回应,您可以在服务类、基本抽象类或更简单地说,在您的控制器中引发这些事件中的任何一个。这是控制器引发事件的示例:
public TimelinesController(IRepository repository)
{
_serviceTasks = new TimelineService(repository);
repository.SavedChanges +=
new EventHandler<RepositorySavedChangesEventArgs>(repository_SavedChanges);
}
private void repository_SavedChanges(object sender, RepositorySavedChangesEventArgs e)
{
var newDate = e.AuditDate;
/* do something fancy with the audit date */
}
希望这能为您指明一个更“明确”的方向:)