在模型和DTO之间转换LINQ表达式,以便在存储库和DAO中使用
本文关键字:存储 DAO DTO 模型 之间 转换 表达式 LINQ | 更新日期: 2023-09-27 18:03:45
我试图在应用程序中抽象出数据访问层和存储库/模型层。
到目前为止,我已经有了这样的体系结构:我的存储库返回并接受我的模型类。示例:车辆模型由vehicleerepository仓库管理。
现在,为了从实际模型中抽象出数据库层特定类型,我实现了DAO对象,并实现了一个DTO。
示例:VehicleDao将只接受并返回VehicleDto对象(它与Vehicle model的属性略有不同,以考虑数据库特定的类型)。车辆存储库的工作是将车辆模型转换为车辆存储库,然后再转换回来。
我的问题是当我想通过LINQ表达式发送时。我的存储库将只接受基于Vehicle模型类的表达式:
public async Task<IList<Vehicle>> GetAll(Expression<Func<Vehicle, bool>> condition)
{
// Return the results
// _dao is type VehicleDao
return await _dao.Find<T>(condition);
}
我的DAO对象有一个类似的方法,但是它接受并返回VehicleDto对象,并直接处理数据库集合。
public async Task<IList<VehicleDto>> GetAll(Expression<Func<VehicleDto, bool>> condition)
{
// Return the results
// _collection is my database managed collection (MongoDB in this case)
return await _collection.Find<T>(condition).ToListAsync();
}
显然,我得到了一个构建错误,因为LINQ表达式在Vehicle和VehicleDto对象之间不兼容…
所以,我想知道解决这个问题的最好方法是什么?我应该将Model> DTO的转换移动到DAO对象中吗?我应该不使用表达式从MongoDB集合查询数据,并使用具体的函数,如GetByName, GetByMake等,而不是有能力在方法中指定查询。我的最终目标是让模型/回购层与DAO层完全隔离。1)测试目的显然,但2)如果我需要从MongoDB移动到其他的轨道上,我只需要重写/测试数据访问层。
任何对这个问题的帮助都是很棒的!
如果你试图抽象层,那么你必须使用抽象。
基于接口而不是具体类型的函数将是我想到的第一件事:
public interface IVehicleDomain : IDomain //you could extend a base interface if you wanted.
{
public string Field1 { get; set; }
}
然后在域类和dto类之间实现这个接口。最后,在两个体系结构层上使用接口,接口应该存在于dto和域类都可以访问的公共程序集中。
public async Task<IList<Vehicle>> GetAll(Expression<Func<Vehicle, bool>> condition)
{
// Return the results
// _dao is type VehicleDao
return await _dao.Find<T>(condition);
}
public async Task<IList<IVehicle>> GetAll(Expression<Func<IVehicle, bool>> condition)
{
// Return the results
// _collection is my database managed collection (MongoDB in this case)
return await _collection.Find<T>(condition).ToListAsync();
}