2012-05-23 20 views
0

當某些預訂發生更改時,我希望所有人都能收到有關更改的郵件。ASP.NET MVC中的自動郵件

其實我不知道如何完成這件事。但我應該是第一個問題。 我應該如何檢查變化是否一致以及我想如何知道哪些人蔘與了變更?

我使用實體框架(延遲加載)在MVC 3

+3

你應該建立這種邏輯到你的職責是負責創建/編輯保留。通過數據庫關係推斷與預訂相關的人員 - 這種工作方式完全取決於您的設計,我們對 – musefan

+0

一無所知您給我們提供的信息非常少。首先,您必須找到要發送電子郵件的用戶及其電子郵件地址。數據庫中的用戶是? 「預訂」表和用戶之間是否有任何參考?然後你必須有一臺可以發送郵件的SMTP服務器。無論您在代碼中何處保存任何可以創建電子郵件併發送給相關用戶的更改。查看.NET中的MailMessage類。 SMTP服務器通常由IT部門設置(並維護)。 – mortb

回答

1

deltu,

這可以通過多種方式來解決。我今天使用的是基於在存儲庫保存更改時引發事件。不知道你的配置是什麼樣子,但這裏有我做的一個片段:

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事件處理程序。任務完成。你從字面上只在你知道關鍵變化的地方進行訂閱,然後發送一封電子郵件服務呼叫inseide該事件處理程序。

希望這會有所幫助。

迴應下面的評論,您可以在控制器中提升服務類,基本抽象類或更簡單的事件。這裏的控制器引發事件的例子:

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

希望這點你在一個更「尖」方向:)

+0

+1,儘管這樣做的麻煩之處在於你會從中間層而不是您的表示層有效地生成電子郵件。如果你已經將它們分開了,那麼你可能不再容易訪問用於呈現HTML電子郵件模板等的MVC部分 - 當我這樣做時,我最終不得不將整個模板引擎添加到我的中間僅僅爲了這一點:我們在Spark上解決了這個問題,事後看來是非常可怕的。不過那是Razor之前的版本,我認爲你現在可以在沒有HttpContext等的環境中使用它。 – Rup

+0

是的,這對我有很大的幫助。你給了我一些我應該使用的非常好的信息。還有一個非常快速的反應。 – deltu100

+0

歡呼RUP - 是的,Razor使這個中間層訪問比網絡表格日子更容易一個h3ll。另一種方法是將您的中間層服務僅用於獲取所需的電子郵件地址,並通過日誌記錄機制或電子郵件服務等將其傳遞給表示層以供使用。圖層:) –