看起來您的IMyDataProviderLayer
基本上是您的「存儲庫」抽象。您可以擁有該接口的實現或模擬,該接口返回List<T>
支持的IQueryable
,而不是使用訪問數據庫的普通提供程序。
public class QueryableList<T> : System.Linq.IQueryable<T>
{
private IList<T> _data;
public QueryableList()
{
_data = new List<T>();
}
public QueryableList(IList<T> data)
{
_data = data;
}
public IEnumerator<T> GetEnumerator()
{
return _data.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return _data.GetEnumerator();
}
public Expression Expression
{
get { return Expression.Constant(_data.AsQueryable()); }
}
public IQueryProvider Provider
{
get { return _data.AsQueryable().Provider; }
}
public Type ElementType
{
get { return typeof(T); }
}
}
然後你就可以做一個模擬IMyDataProviderLayer
返回其中之一作爲其Context
:
您可以通過自定義的堵塞IQueryable
實現,封裝協議的IList
實現這一目標。例如(使用MOQ):
// Make a mock data access layer, that is backed by a List.
var mockedDataLayer = new Mock<IMyDataProviderLayer>();
mockedDataLayer.SetupGet(x => x.Context, new QueryableList<IMyData>()
{
new MyData() { Intdata = 5, DoubleData = 1.2 },
new MyData() { Intdata = 2, DoubleData = 6.8 },
});
// Now we can use this.
var dataCollection = from data in mockedDataLayer.Object.Context
where data.Intdata == 5
select data;
編輯:
我回來這一點了一段時間後,我寫的,並且意識到自己所做的IQueryable的名單包裝解決一個不同的問題。實際上,你完全中央社省略,並簡單地做:
using System.Linq;
IQueryable<IMyData> mydata = new List<IMyData>()
{
new MyData() { Intdata = 5, DoubleData = 1.2 },
new MyData() { Intdata = 2, DoubleData = 6.8 }
}.AsQueryable();
到.AsQueryable()
調用變成了List到一個IQueryable你,而不是用我上面的包裝。
對不起,我感到困惑:)
哇......那很快。我會嘗試你的答案爲實際的實現。但從邏輯上講,它對我來說看起來是正確感謝Repository模式鏈接。 – 2012-02-17 16:10:54