我有以下解决方案结构:
Portal.DataAccess - >具有针对数据库的方法的类库项目......
Portal.DomainEntities - >类库项目(我有我的存储类)
Portal.Business - >类库(前端和数据访问之间的代理)
Portal.Web - >引用Web上下文的类库(system.web.mvc等等)
Portal.Web.Website1 - >我的网站1
Portal.Web.Website2 - >我的网站2
...
Portal.Web.WebsiteN - >我的网站N
我的所有网站都使用相同的查询,我想创建一个具有以下结构的文件:
<?xml version="1.0" encoding="utf-8" ?>
<Queries>
<Query>
<Name>DetailArticle</Name>
<Value>
<![CDATA[
select * from Articles where ID={ID}
]]>
</Value>
..... All my queries here
</Queries>
您认为将这个xml文件放入反序列化以供使用的最佳位置在哪里?我认为将它作为嵌入式资源放入Portal.DataAccess可能会很好,但我的问题是我不希望每次想要查询时都能访问磁盘。另外,这个项目不包含对WebContext的引用(所以我不能把它放在缓存中)。出于这个原因,我想把这个文件放在Portal.Web上,这是一个具有所有网站共同功能的项目。
你的推荐是什么?是否有其他地方(除了网络缓存)来放置xml的反序列化类?
答案 0 :(得分:1)
我认为最好的地方将是dataacess项目。此外,您可以将此文件添加到所有其他项目,而不是直接添加,但使用"add as link"选项。它允许您只在一个地方更改内容,所有更改将自动在所有“相关”文件中完成。
另外,如果你想在应用程序工作期间将这些查询存储在内,那么将文件放到目录的根目录并实现简单的静态类是合理的,这将在applcation启动时读取此查询,然后使用此用于从内存中读取所需查询的类。
答案 1 :(得分:0)
首先,使用xml文件存储查询的好处是什么?大多数情况下,查询是静态的,并在代码更改时发生更改(新功能,错误修复等)。
那就是说,为什么不简单地在代码中编写查询,在使用方法中的direclty或在专用的const类中(在DataAccess项目中):
public sealed class Queries
{
public const string Query1 = "SELECT ...";
public const string Query2 = "SELECT ...";
}
或者,您可以将xml作为资源文件附加并直接读取(而不是从磁盘中读取)。
如果实际需要从文件中读取,则可以执行一次反序列化操作:
public class Query
{
public string Name { get; set;}
public string Body { get; set;}
}
public static class QueryProvider
{
private static readonly Dictionnary<string, Query> m_Queries;
static QueryProvider()
{
m_Queries = ReadTheFile(); // A method that read the files and build the dictionnary
}
public static Dictionnary<string, Query> Queries{ get; set;}
}
最后,如果将文件放在缓存中以便能够定期读取它,则可以使用一些IOC模式为底层提供缓存提供程序。