包装 ObjectContext 实现的方法

本文关键字:方法 实现 ObjectContext 包装 | 更新日期: 2023-09-27 18:36:36

我对MVC 4和实体框架 ASP.NET 还是新手。但是我开始使用这两个框架为应用程序做出贡献,我得到了这个(可能是自动生成的)全能ObjectContext实现,称为ModelContainer。它不能在测试环境中轻易被模拟,它有很多方法和属性(所以在它前面放一个接口等可能不是最好的主意)。

例如,它有很多这样的属性:

public ObjectSet<Company> Companies { '' ... }

我现在的想法是创建一个简单的界面,如下所示:

public interface IDB
{
    IQueryable<T> GetQueryableObjects<T>();
}

并为怪物创建一个适配器:

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";
    }
}

我知道反射很慢,但在这种情况下很好。所以我的问题是:

  1. 这种方法有什么缺点?
  2. 还有什么可以改进的?
  3. 还有
  4. 哪些其他方法可以解决包装ObjectContext实现的原始问题?

包装 ObjectContext 实现的方法

您可以创建一个使用 CreateObjectSet<T> 的泛型方法:

public IQueryable<T> GetQueryableObjects<T>()
{       
    return _db.CreateObjectSet<T>();
}