2017-06-19 161 views
0

我正在使用工作單元模式,因爲它在此article中描述。文章解釋說,每一個服務應該注入的UnitOfWork:如何使工作單元與服務模式一起工作?

private readonly IUnitOfWork _unitOfWork; 

另外一個服務必須有一個公共的方法來提交單位的工作操作:

public void Save() 
{ 
    _unitOfWork.Commit(); 
} 

Save方法只可以通過調用調用服務的(webapi)控制器。

但這裏有我的顧慮:

1)控制器可以調用與數據庫更新多個服務,並且在這種情況下,應該調用保存()爲每個服務?那麼如果需要回滾呢?

像:

[HttpGet] 
public IHttpActionResult UpdateArchive() 
{ 
    _service1.DoUpdate(); 
    _service1.Save(); 
    _service2.DoUpdate(); 
    _service2.Save(); 
} 

如果什麼service2.Save失敗了呢?

2)如果某個服務調用另一個服務,控制器將如何知道要調用哪個Save?

我對這個工作單位有點困惑。

回答

2

,並在這種情況下,應該調用保存()爲每個服務

這取決於服務是否共享相同的工作單位。如果是,請致電Save任何人,它將操作委託給同一個UoW。

然後如果需要回滾

由於沒有交易,怎麼是你應該推出什麼回來怎麼辦?

在另一方面,在業務流程中引入明確的事務可以輕鬆地將回滾變化:

try 
{ 
    using (TransactionScope scope = new TransactionScope()) 
    { 
    _service1.DoUpdate(); 
    _service1.Save(); 
    _service2.DoUpdate(); 
    _service2.Save(); 

    scope.Complete(); 
    } 
} 
catch 
{ 
    // rollback occurs since the transaction was not completed 
} 

TransactionScope是非常方便,因爲它應該正確地在共享UOW和事務處理兩種交易通過注入不同服務的多個不同UoWs。

如果service2.Save失敗會怎麼樣?

您回滾事務,這裏幾乎沒有任何其他選項。

無論如何,repositories/uow over EF are disputable。你的問題的一部分是多個服務共享同一個UoW實例,所以基本上你調用哪個Save並不重要,它們都在同樣的DbContext上調用SaveChanges

我的意見(儘管這裏應該避免的意見)是,你可能會從你的服務中刪除Save,並在編排結束時在你的數據庫上下文中使用單一的SaveChanges。這會使意圖更清楚 - 服務是改變UoW的內部狀態,但持續改變的責任在控制器上。

+0

關於你的最後一段:你不會直接從控制器調用db上下文的SaveChanges,對嗎?我的意思是,它不應該被抽象掉嗎? – brinch

+1

這真的取決於我是否擁有DbContext。如果沒有(例如它是由DI容器注入的,並且你甚至沒有在控制器的任何地方看到它),我會在其中一個服務上調用「Save」。 –

相關問題