public interface IRepository<T>
{
IQueryable<T> GetAll();
}
這
public class XmlProductRepository : IRepository<Product>
{
private const string RelativePath = "~/data/products.xml";
public string Filename { get; private set; }
public XmlLoader Loader { get; private set; }
public XmlProductRepository(HttpContextBase httpContext, XmlLoader loader)
{
Filename = httpContext.Server.MapPath(RelativePath);
Loader = loader;
}
public IQueryable<Product> GetAll()
{
return Loader.Load<ProductCollection>(Filename).AsQueryable();
}
}
你會做什麼,以支持許多對象類型(除了產品,另外20種喜歡的插件,擴展,頁面,部分等)?該接口的實現是所有對象類型相同,即不同的唯一事情就是RelativePath - 我們要保存不同類型的成他們的類型名稱舉辦不同的文件夾,像這樣
- 〜/數據/產品/ ...
- 〜/數據/插件/ ...
- 〜/數據/頁/ ...
所以假設改變的是路徑的唯一的事。顯然,我們不想爲每個對象類型創建一個存儲庫類,並將相同的代碼複製到每個類中。我們只是想構建基於用於T的對象的路徑。
什麼是* ProductCollection *?似乎我們必須爲每種類型實現* GetAll()*,因爲不同的集合... – tanascius 2010-06-29 15:33:46
不,我們不需要這樣做,因爲這會由執行反序列化的XmlLoader類加載,所以這可以很好地解決。 – mare 2010-06-29 15:43:47
其實你說得對,但這段代碼實際上並不是GetAll()的正確實現。代替ProductCollection,將會有一個基本集合類,所有特定的集合都繼承自它。 – mare 2010-06-29 15:49:19