簡體   English   中英

包裝ObjectContext實現的方法

[英]Approaches to wrapping ObjectContext implementation

我還是ASP.NET MVC 4和實體框架的新手。 但是我開始使用這兩種框架為應用程序做貢獻,並且得到了這個(可能是自動生成的)全能的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. 還有什么其他方法可以解決我最初包裝ObjectContext實現的問題?

您可以創建一個使用CreateObjectSet<T>的通用方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM