我有一个实体框架生成CodeModel。 (数据库第一)。 所有这些都是数据库中的视图。 公共类TypeCode { 公共字符串代码; public string描述 } 公共类TypeCode1 { 公共字符串代码; public string描述 }
每次打开应用程序时,我们都会从Views中加载这些代码。这需要花费相当多的时间(3分钟)才能加载一些初始化数据(每次应用程序打开时)。我有1000个这样的TypeCode类型 - TypeCode1,TypeCode2..All的TypeCodes具有相同的结构代码,描述
这就是我们加载代码列表的方式
using(SQlEntitiesContext _context = new SQlEntitiesContext())
{
TypeCodes = _context.TypeCode.ToList();
TypeCodes1 = _context.TypeCode1.ToList();.....
..
..
..
}
我想构建一个可以加载所有这些列表的Web服务(它们不会更改),并在需要时为每个应用程序实例使用它们。优选地,不为每个应用程序实例查询DB。 Webservice将做更多的东西,不仅仅是Codes.It将加载和缓存所有代码开始。 目前由于网络需要更长的时间
所以我就像这样开始了wcfService
public interface ICodesService
{
[OperationContract]
Codes LoadCodeData();
}
[Serializable]
[DataContract]
public class Codes
{
[DataMember]
public List<TypeCode> TypeCodes{ get; set; }
[DataMember]
public List<TypeCode1> TypeCodes1{ get; set; }
}
}
LoadCodes.svc
public class LoadCodesService : ICodesService
{
Codes _AllCodes = new Codes();
public Codes LoadCodeData()
{
using (CodeEntities _codes = new CodeEntities())
{
_AllCodes.TypeCodes= _codes.TypeCode.ToList();
_AllCodes.TypeCodes1= _codes.TypeCodes.ToList();
}
}
在客户端
private void button1_Click(object sender, EventArgs e)
{
LoadCodesServiceReference.CodesServiceClient proxy = new LoadCodesServiceReference.CodesServiceClient();
_codes = proxy.LoadCodeData();
}
我想知道将这些对象中的任何一个静态化是一个好主意。对于正在加载的应用程序的每个实例。我们可以以某种方式缓存现有代码并在需要时重用。有哪些选择?使用DataReader不是一种选择。
答案 0 :(得分:0)
我会考虑一个静态工厂方法,它在第一次创建类型时从db查询它们的状态,但之后缓存它们并返回一个用缓存水合而不是调用Db的对象。您可以将缓存逻辑放在工厂方法的后面,随着时间的推移,任何改进都将转移到所有创建的对象。
这样的事情:
public static class SingletonData
{
static private List<TypeCode> _TypeCode;
public static List<TypeCode> TypeCode
{
get
{
if (_TypeCode!=null) return _TypeCode;
using (var db = new SQlEntitiesContainer())
{
_TypeCode = db.TypeCodes.ToList();
return _TypeCode;
}
}
}
static private List<TypeCode1> _TypeCode1;
public static List<TypeCode1> TypeCode1
{
get
{
if (_TypeCode1 != null) return _TypeCode1;
using (var db = new SQlEntitiesContainer())
{
_TypeCode1 = db.TypeCode1.ToList();
return _TypeCode1;
}
}
}
}