在模型和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移动到其他的轨道上,我只需要重写/测试数据访问层。

任何对这个问题的帮助都是很棒的!

在模型和DTO之间转换LINQ表达式,以便在存储库和DAO中使用

如果你试图抽象层,那么你必须使用抽象。

基于接口而不是具体类型的函数将是我想到的第一件事:

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();
}