2011-04-05 224 views
0

我首先爲每個實體創建了一個新的存儲庫接口,例如IClientRepository。然後,我爲每個實體做了一堂課,例如SqlClientRepository。我爲很多實體做了這個,然後意識到他們都有相同的方法:添加,更新,刪除,GetAll。存儲庫模式問題

所以我意識到,我應該只是做一個接口,而不是爲每個接口單獨一個。

的問題是,現在我的依賴注入將無法工作,因爲我可以在接口只映射到一個存儲庫:

Bind<IClientRepository>().To<SqlClientsRepository>().WithConstructorArgument("connectionString", WebConfigurationManager.ConnectionStrings["MyDb"].ConnectionString); 

唯一的變通辦法,我可以看到的是所有存儲庫的組合或回到我的第一次嘗試。使用第一次嘗試還將允許我改變某些實體的返回類型,例如IClientRepository.Add()可以返回新的客戶端的ID,而其他一些實體可能不需要它。

欣賞任何想法。

回答

2

你可以讓你的ClientRepository實現你的BaseRepository 一個特定的IClientRepository。這樣你的Base可以有通常的Add/Remove等,你的IClientRepository可以有專門的方法(或者在某些情況下可能是空的)。您的IoC可以使用您的IClientRepository解決。

這是我要做的事:

public class CustomerRepository : BaseRepository<Customer>, ICustomerRepository {...} 
and 
unityContainer.RegisterType<ICustomerRepository, CustomerRepository>(); 

祝你好運:)

+0

是的,我忘了提及,作爲一種選擇,我實際上已經做到了。讓所有這些接口都是空白的(現在還沒有需要的方法)似乎很奇怪。還有,如果我想爲一個實體返回不同的返回類型,就像我在我的問題中提到的那樣? – Joe 2011-04-05 22:07:38

+0

如果你想在少數情況下返回不同的東西,你可以把它放在你的特定接口上 - 除非你希望在你的基礎上添加/刪除/所有等等,在這種情況下,你應該考慮不使用baserepository所有? – 2011-04-06 13:53:25

0

存儲庫的一種常見方法是使用所有回購可以使用的常見CRUD方法或方法創建基本接口,如「IRepository」。然後爲每個特定的存儲庫創建一個從基本接口派生的新接口,但包含該回購的特定於域的方法。對於基本版本庫實現和更具體的實現類可以做同樣的事情。通過這種方式,您可以擁有通用功能的通用位置,但對於每個具體的特定於域的存儲庫實現,您仍然有特定的接口。

0

很難說肯定不知道你要完成的任務。在我的最新項目中,每個班級有一個儲存庫IRepository<T>。這可能會讓你擺脫你的IoC綁定問題。

0

一個解決方案是使接口通用。這樣,它足夠普遍,同時仍然是靈活的。