0

当某些预订发生更改时,我希望所有参与的人都能收到有关更改的邮件。

实际上我不确定如何完成这项工作。但我想我的第一个问题应该是。我应该如何检查更改是否一致,以及我应该如何知道哪些人参与了更改?

我在 MVC 3 中使用实体框架(延迟加载)。

4

1 回答 1

1

三角洲,

这可以通过多种方式解决。我今天使用的是基于在存储库保存更改时引发事件。不确定您的配置是什么样的,但这是我所做的一个片段:

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 */
}

希望这能为您指明一个更“明确”的方向:)

于 2012-05-23T08:55:36.707 回答