2010-04-16 108 views
0

存儲庫模式 - 切換出數據庫並切換XML文件。存儲庫模式 - 切換數據庫並切換XML文件

你好

我有一個asp.net MVC 2.0項目,我都遵循Repository模式。

定期地,我正在失去對數據庫服務器的訪問權限,所以我想讓其他機制(XML文件)繼續開發。遺憾的是,不可能有本地版本的db!

我認爲這將是相對容易使用存儲庫模式,切換數據庫存儲庫和切換XML版本。但是,我真的有麻煩提出一個解決方案。

我已經試過LinqToXML但隨後跑進試圖爲LinqToXML ToList返回Generic.List

我應該映射的XElement名單上用手新聞列表返回的新聞項列表的問題? 與News類中的LinqToSQL屬性相比,它看起來有點笨重,然後簡單地做一個Table ..... ToList();

任何方向將不勝感激。

謝謝

回答

0

只使用Linq-To-XML進行解析。喜歡的東西:

(from a in b 
where b.Element("type").Value == "test" 
select new c(){d=b.Element("prop").Value}).ToList(); 
+0

這是行不通的 - 但這意味着我需要將所有c屬性映射到b屬性。 這是您不需要使用LinqToSQL的事情,因爲c類已經在屬性上具有Linq.Mapping.ColumnAttribute。 我想知道LinqToXML是否有一些非常漂亮或實際上可以使用類中已有的Linq屬性。 – 2010-04-16 14:23:23

3

你應該有類似

public interface IRepo 
{ 
     //methods for data 
} 
public class DbRepo : IRepo 
{ 
     // IRepo methods for db access 
} 
public class XmlRepo : IRepo 
{ 
     // IRepo methods for xml access 
} 

,並依靠接口。然後

IRepo repo; 
try 
{ 
    repo = new DbRepo(); //this should throw if there is no db connectivity 
} 
catch 
{ 
    repo = new XmlRepo(); 
} 
0

你可能會做一些這方面已經...

我建議你創建一個IFooRepository接口。從那裏你可以有一個FooRepository(將你的linq存放到SQL數據訪問)和一個FooMockRepository(你有你的linq到XML模擬數據訪問)。如果你遵循POCO(linq to SQL還不是很好),那麼你可以使用automapper將你的L2S對象映射到你的POCO對象。然後,您可以在FooMockRepository中使用automapper將您的linq中的POCO對象(通過自動映射器)返回到XML查詢。剩下的就是使用StructureMap(或其他IoC)來爲你選擇合適的具體類型,語法如下所示:...

IFooRepository fooRepository = ObjectFactory.GetInstance();

然後在您的環境配置腳本中,您可以配置您的IoC以獲取適當的存儲庫,以便獲得與更加優質的環境相對應的存儲庫。

0

我應該手動將XElement列表映射到新聞列表嗎?

沒錯。 存儲庫應該返回一個List,而不是Linq到SQL實體或XElements

+0

謝謝梅爾 - 存儲庫確實返回一個List。我的問題是如何創建該列表。請參閱下面對Oskar的評論。 – 2010-04-16 14:24:32

0

因爲這只是爲了你的持續發展,你是否真的需要堅持?或者你可以使用內存存儲庫來完成你的需求?

public interface IFoo 
{ 
    IList<News> GetNews(); 
} 

public class InProcFoo : IFoo 
{ 

    private static IList<News> news; 

    public InProcFoo() 
    { 
     news = new List<News>(); 
     news.Add(new News()); 
    } 

    public IList<News> GetNews() 
    { 
     return news; 
    } 
} 

如果需要持久性,也許你可以簡單地使用數據合同串行得到你所需要的

public class DataContractFoo :IFoo, IDisposable 
{ 
     private static IList<News> news; 
    public DataContractFoo() 
    { 
    //Load up news from a serialized news list from some xml file. 

    } 
     public IList<News> GetNews() 
     { 
      return news; 
     } 
    public void Dispose() 
    { 
     //Serialize news via the data contract serializer to your drive. 

    } 
} 

我不那麼這被認爲是在這裏有一個編譯器,但希望能幫助你繼續開發,而不必擔心Linq到Xml