存储库模式 - 切换数据库并切换XML文件

时间:2010-04-16 14:00:41

标签: c# linq-to-sql testing linq-to-xml repository-pattern

存储库模式 - 切换数据库并切换XML文件。

您好

我有一个asp.net MVC 2.0项目,我遵循了Repository模式。

我定期失去对数据库服务器的访问权限,因此我希望有另一种机制(XML文件)继续开发。遗憾的是,不可能有本地版本的db!

我认为使用Repository模式相对容易,切换db存储库并切换XML版本。 但是,我在提出解决方案时遇到了麻烦。

我尝试过LinqToXML,但是当LinqToXML ToList返回Generic.List时,尝试返回新闻列表项时遇到了问题

我应该手动将XElement列表映射到新闻列表吗? 与News类中的LinqToSQL属性相比,它只是看起来有点笨拙,然后简单地做一个表...... ToList();

任何方向都会受到赞赏。

由于

5 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

使用Linq-To-XML解析。类似的东西:

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

答案 2 :(得分:0)

你可能已经做了一些......

我建议你创建一个IFooRepository接口。从那里你可以有一个FooRepository(包含你的linq到SQL数据访问)和一个FooMockRepository(你有你的linq到XML模拟数据访问)。如果您遵循POCO(linq to SQL还不是很好),那么您可以使用automapper将L2S对象映射到POCO对象。然后,这将为您提供所需的分离,以便能够在FooMockRepository中使用automapper将POCO对象(通过自动映射器)从linq返回到XML查询。剩下的就是使用StructureMap(或其他IoC)为您选择适当的具体类型,语法如...

IFooRepository fooRepository = ObjectFactory.GetInstance();

然后,在您的环境配置脚本中,您可以配置IoC以获取适用于dev的适当存储库与更环保的环境。

答案 3 :(得分:0)

  

我应该手动将XElement列表映射到新闻列表吗?

完全。 存储库应返回List,而不是Linq到SQL实体或XElements

答案 4 :(得分: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