我还是ASP.NET MVC 4和实体框架的新手。但是我开始使用这两个框架为一个应用程序做贡献,我得到了这个(可能是自动生成的)全能ObjectContext
实现,名为ModelContainer
。它不容易在测试环境中被模拟,并且它有很多方法和属性(因此在它前面放置一个接口等可能不是最好的主意)。
例如,它有很多这些属性:
public ObjectSet<Company> Companies { \\ ... }
我现在的想法是创建一个这样的简单界面:
public interface IDB
{
IQueryable<T> GetQueryableObjects<T>();
}
为monstrosity创建一个适配器:
public class ModelContainerDB : IDB
{
private readonly ModelContainer _db;
private static readonly Type _dbType = typeof(ModelContainer);
public ModelContainerDB(ModelContainer db)
{
_db = db;
}
public IQueryable<T> GetQueryableObjects<T>()
{
var objectType = typeof (T);
var queryableName = GetPropertyName(objectType.Name);
var propertyInfo = _dbType.GetProperty(queryableName, BindingFlags.Public | BindingFlags.Instance);
return (IQueryable<T>) propertyInfo.GetValue(_db, new object[0]);
}
private string GetPropertyName(string objectName)
{
if (objectName.EndsWith("y"))
return objectName.Remove(objectName.Length - 1) + "ies";
return objectName + "s";
}
}
我知道反射很慢但在这种情况下它很好。所以我的问题是:
ObjectContext
实施问题的其他方法是什么?答案 0 :(得分:2)
您可以创建一个使用CreateObjectSet<T>
的通用方法:
public IQueryable<T> GetQueryableObjects<T>()
{
return _db.CreateObjectSet<T>();
}