我正在开发一个应用程序,并尝试遵循 Robert Martin的:“ Clean Architecture” 。
我从数据层开始,并设计了一个远程数据源 里面有这种代码:
public override async Task<IList<Entity>> GetAsync(Expression<Func<Entity, bool>> expression = null)
{
}
其中 Expression 本质上是 Specification Pattern ,即通常不变的代码,我们只需在输入的条件下设置 Lambda 代码即可选择实体。
此方法对本地数据source(DB)
非常有用,因为我们可以将编译后的表达式传递给DbContext
。
但这是远程数据源的问题,因为没有DbContext
,我必须根据表达式中的条件创建 URL 。
我该怎么做?尽管必须创建 URL 才能按条件获取实体,但我还是有一些过滤键作为字符串对象并取决于表达式。
//Call inside UseCase
var res = await remoteDataSource.GetAsync(z=> z.Address == EntityPlace.Moscow);
//In DataSource class
private static string UrlAddress = @"https://my.address/?";
private const string UrlPlaceFilter = @"s%5Bplace%5D%5B0%5D=";
private List<string> UrlPlaces = new List<string>()
{
"Moscow",
"London",
"Paris"
};
public override async Task<IList<Entity>> GetAsync(Expression<Func<Entity, bool>> expression = null)
{
// So according to our condition
//z=> z.Address == EntityPlace.Moscow
// We need to create a next URL somehow
//https://my.address/?s%5Bplace%5D%5B%5D=Moscow
}