【问题标题】:Repository pattern - Switch out the database and switch in XML files存储库模式 - 切换出数据库并切换到 XML 文件
【发布时间】:2010-04-16 14:00:40
【问题描述】:

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

你好

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

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

我认为使用存储库模式来切换数据库存储库并切换到 XML 版本会相对容易。 但是,我很难想出一个解决方案。

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

我应该手动将 XElement 列表映射到新闻列表吗? 与 News 类上的 LinqToSQL 属性相比,它似乎有点笨拙,然后只是做一个 Table.....ToList();

任何方向都将不胜感激。

谢谢

【问题讨论】:

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


    【解决方案1】:

    你应该有类似的东西

    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();
    }
    

    【讨论】:

      【解决方案2】:

      只需使用 Linq-To-XML 进行解析。比如:

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

      【讨论】:

      • 这确实有效——但这意味着我需要将所有 c 属性映射到 b 属性。这是您不需要对 LinqToSQL 执行的操作,因为 c 类已经在属性上具有 Linq.Mapping.ColumnAttribute。我想知道 LinqToXML 是否有一些漂亮的东西,或者实际上可以使用类中已经存在的 Linq 属性。
      【解决方案3】:

      你可能已经在做这些了……

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

      IFooRepository fooRepository = ObjectFactory.GetInstance();

      然后在您的环境配置脚本中,您可以配置您的 IoC 以获得适当的存储库,用于开发与更像产品的环境。

      【讨论】:

        【解决方案4】:

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

        没错。 存储库应该返回一个列表,而不是 Linq 到 SQL 实体或 XElements

        【讨论】:

        • 感谢 Mel - 存储库确实返回了一个列表。我的问题是如何创建该列表。请参阅下面对奥斯卡的评论。
        【解决方案5】:

        既然这只是为了你的持续发展,你真的需要坚持吗?或者您可以使用内存存储库来满足您的需求吗?

        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 to Xml

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 2021-08-09
          • 2021-12-31
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多