存储库模式 - 切换数据库并切换XML文件。
您好
我有一个asp.net MVC 2.0项目,我遵循了Repository模式。
我定期失去对数据库服务器的访问权限,因此我希望有另一种机制(XML文件)继续开发。遗憾的是,不可能有本地版本的db!
我认为使用Repository模式相对容易,切换db存储库并切换XML版本。 但是,我在提出解决方案时遇到了麻烦。
我尝试过LinqToXML,但是当LinqToXML ToList返回Generic.List时,尝试返回新闻列表项时遇到了问题
我应该手动将XElement列表映射到新闻列表吗? 与News类中的LinqToSQL属性相比,它只是看起来有点笨拙,然后简单地做一个表...... ToList();
任何方向都会受到赞赏。
由于
答案 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