2013-01-11 56 views
0

想象一下,我有一種像下面這樣的方法,它使用一些策略來創建新產品,並將它們作爲結果保存在Db中。應該怎樣避免將UnitOfWork實例傳遞給策略?

而且所有事情都是作爲工作單元的一部分發生的。

(我的關心和)問題: 我擔心的是它確定或預防到的UnitOfWork實例作爲參數傳遞戰略和提交根方法的變化? 如何避免將UnitOfWork實例作爲參數傳遞給策略,但仍使它們作爲工作單元的一部分工作?

(我不喜歡哪位,我不希望這樣的事實,有人可以通過調用錯誤戰略.Commit內實現)

public void DoTheJob(CustomerRequest req) 
{ 

var materialsPikcerStrategyFactory = new PickerStrategyFactory(); 
var productionStrategyFactory = new ProductionStrategyFactory(); 

var materialsPickerStrategy = materialsPikcerStrategyFactory.GetStrategy(req); 
var productionStrategy = productionStrategyFactory.GetStrategy(req); 

using (var uow = new UnitOfWorkFactory()) 
{ 
    var materials = materialsPickerStrategy.PickMaterials(req, uow); 
    var products = productionStrategy.CreateProductsWith(materials, uow); 
    uow.Commit(); 
} 

} 


puplic abstract class MaterialsPickerStrategy 
{ 

// Picks some material entities from Db and modifies some of its properties before usage 
public abstract ICollection<Material> PickMaterials(CustomerRequest req, IUnitOfWorkFactory uow); 

} 

public abstract class ProductionStrategy 
{ 
// Gets the materials and creates some new instances by ADD'ing them to the repository 
public abstract void CreateProductsWith (ICollection<Material> materials, IUnitOfWorkFactory uow); 
} 

回答

1

好像你的代碼只使用工作單位而不是倉庫。他們通常一起使用來解決您的問題。存儲庫負責從數據庫獲取數據或註冊當前工作單元中的更改,而工作單元負責提交已註冊的更改。這將允許您將存儲庫傳遞給您的策略,並且策略將無法訪問工作單元。

根據EF ObjectContext/DbContext可以視爲工作單元,ObjectSet/DbSet可視爲存儲庫。如果您有自定義工作單元和自定義存儲庫,則它們必須共享單個EF上下文實例。

+0

因此,我可以傳遞屬於我使用的UnitOfWork屬性的存儲庫,而不是使用UnitOfWork。像uow.MaterialsRepository – pencilCake

+0

是的,這是主意。 –

1

我想有一個的UnitOfWork,我作爲一個依賴於通過任何上課需要做的提交,在你的情況下,如果我明白,你不想成爲你的策略。

的的UnitOfWork應該知道如何提交你的更新,因爲它會以某種數據上下文的參考。也許和實體框架模型,的DbContext等

你的策略不應該瞭解的UnitOfWork,如果他們不應該犯。我猜你可能使用UnitOfWork來將你的數據上下文暴露給你的策略。

你的戰略,你的UnitOfWork都應該有相同的數據上下文引用。然後你的策略與上下文和其他例程一起工作,它可能使用了許多策略,最後會提及UnitOfWork來提交它。

這一切都是相當簡單,如果你使用的是IOC框架,因爲你會指定爲PerRequest數據上下文的生命週期範圍內,你會通過它作爲一個依賴到這兩個類。當框架將依賴關係注入到您的類中時,它將使用相同的實例,以便您的策略將寫入由工作單元持有的同一實例。通過這種方式,您通過策略對數據所做的更改與工作單元要執行的更改相同。如果你真的對IOC很敏感,你實際上可以注入給定類所需的上下文的各個部分,進一步隔離依賴關係。