查找表最佳实践

时间:2014-04-16 14:06:15

标签: c# asp.net-mvc c#-4.0 design-patterns

在我的数据库中,我有很多查找,它将有一个用于更改的UI,我有MVC网站,并且希望将这些查找加载一次,并在发生任何更改时刷新

我的数据访问层如下:

private ClassessEntities Context;
protected Repository()
{
    Context = new ArabicEWorldEntities();
}
public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
    return Context.CreateObjectSet<T>().Where(predicate).ToList();
}
public T First(Expression<Func<T, bool>> predicate)
{
    return Context.CreateObjectSet<T>().Where(predicate).FirstOrDefault();
}
public IEnumerable<T> GetAll()
{
    return Context.CreateObjectSet<T>().ToList();
}
public IEnumerable<T> GetAllOrderBy(Func<T, object> keySelector)
{
    return Context.CreateObjectSet<T>().OrderBy(keySelector).ToList();
}
public IEnumerable<T> GetAllOrderByDescending(Func<T, object> keySelector)
{
    return Context.CreateObjectSet<T>().OrderByDescending(keySelector).ToList();
}
public void Commit()
{
    Context.SaveChanges();
}
public void Add(T entity)
{
    Context.CreateObjectSet<T>().AddObject(entity);
}
public void Update(T entity)
{
    Context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
    Context.SaveChanges();
}
public void Delete(T entity)
{
    Context.DeleteObject(entity);
    Context.SaveChanges();
}
public void Dispose()
{
    if (Context != null)
    {
        Context.Dispose();
    }
    GC.SuppressFinalize(this);
}

并从查找中获取列表我使用

之类的方法
private static ClassesEntities Context;

public static IEnumerable<T> GetLookup<T>() where T : System.Data.Objects.DataClasses.EntityObject
{
    try
    {
        var key = typeof(T).Name;
        // 1. we need the container for the conceptual model
        var container = Context.MetadataWorkspace.GetEntityContainer(
            Context.DefaultContainerName, System.Data.Metadata.Edm.DataSpace.CSpace);
        // 2. we need the name given to the element set in that conceptual model
        var name = container.BaseEntitySets.Where((s) => s.ElementType.Name.Equals(key)).FirstOrDefault().Name;
        // 3. finally, we can create a basic query for this set
        var query = Context.CreateQuery<T>("[" + name + "]");

        return query.ToList();
    }
    catch (System.Data.EntityException ex)
    {
        throw new ArgumentException("Invalid Entity Type supplied for Lookup", ex);
    }
}

任何想法处理我上面讨论的情况加载一次,如果有任何更改重新加载它我使用Web服务将这些方法调用到我的MVC

1 个答案:

答案 0 :(得分:1)

我会有一个CachedLookup类,它包含每个类型(甚至是Dictionary<Type,IEnumerable<T>>)的IEnumerable字段,其中包含缓存的结果,然后GetLookup将是该类的非静态方法。如果没有发生任何变化,它将返回该字段。

您希望缓存无效的方式取决于您。如果你想在一个合理的时间(即不是立即)更新查找,你可以有一个最后更新的时间,然后只检查当前时间(在GetLookup调用上),如果它是在最后一个日期后30分钟并刷新缓存。如果您希望它立即生效,并且您的应用程序中有一些操作使缓存失效,您可以使用InvalidateCache<T>()方法刷新该特定缓存。

CachedLookup将知道如何刷新缓存,并且只是一个获取查找的代理