我正在重构一个应用程序以反转一些依赖项。部分原始代码用于DbContext.Set<MyEntityType>()获取要查询的集合。
通过反转,使用 的代码不再明确知道 MyEntityType DbContext.Set<MyEntityType>(),所以现在我DbContext.Set(TypeVariable)改为使用。
重构在返回正确 DbSet 的范围内起作用。
但是,类型DbContext.Set(TypeVariable).Local是IList(包含类型未知) where-as 的类型DbContext.Set<MyEntityType>().Local是ObservableCollection<MyEntityType>。这意味着现在不可能对 DbSet 执行 Linq。
我能够实现的最佳解决方法是强制转换为 MyEntityType 和其他实体类型实现的接口(为了清楚起见,省略了一些代码)
var set = Context.Set(targetType);
var entity = set.Local.OfType<IActionTarget>()
.FirstOrDefault(l => l.Id == key.Id && l.EffectiveDate == key.EffectiveDate);
var querables = set as IQueryable<IActionTarget>;
entity = querables.FirstOrDefault(e => e.Id == key.Id && e.EffectiveDate == key.EffectiveDate);
Run Code Online (Sandbox Code Playgroud)
所以,两个问题:
为什么不DbContext.Set(TypeVariable)返回强类型集?
有没有更好的方法来进行依赖倒置?
应要求提供更多详细信息
这都是关于依赖的。模型包含通过 EF Code First 以典型方式(但通过Repository)持久化的 POCO 类。一个ActionEvaluator …