我正在使用Entity Framework作为我的ORM,我的每个类都实现了一个基本上代表表结构的接口(每个字段只有一个readonly属性)。这些接口旨在在不同应用程序的程序集之间共享。他们不支持任何写作操作。
现在EF允许我使用IQueryable< EntityClass>的实例。我想拥有的是对IQueryable< IEntityInterface>的支持。这将是最重要的。不用说我希望能够使用接口属性执行Where操作。
它是否可行,或者我在这里浪费时间?我尝试实现自己的IQueryProvider和ExpressionVisitor,但到目前为止还没有很好的实现。关于LINQ的表达式结构,我几乎没有什么经验。它是要走的路还是另一种更好的方式?
答案 0 :(得分:3)
我可能还没有完全理解你想对此做些什么,但我所看到的常见方法(我自己已经采取过)是使用泛型创建存储库。如果您为泛型设置了约束,则可以使用实体界面的属性。像这样......
public interface IRepository<T>
where T : class, IEntityInterface
{
T FindById(int id);
IQueryable<T> All { get; }
}
public class GenericRepository<T> : IRepository<T>
where T : class, IEntityInterface
{
public T FindById(int id)
{
//Uses the Id property from the interface
return All.Where(t => t.Id == id).Single();
}
public IQueryable<T> All
{
get
{
//Get DbContext instance from somewhere
return _dbContext.Set<T>();
}
}
}
public interface IEntityInterface
{
int Id { get; }
}
然后,您可以通过使实体接口成为泛型类型来进一步进行泛型。这一切都与依赖注入和/或工厂模式(如果你进入那个)很好地配合。