Итак, у вас есть несколько методов или классов, которые выполняют некоторые запросы и заполняют ваши данные. Вы хотите записать время начала и окончания запроса в возвращаемом объекте, который всегда будет иметь тип ListReturnDTO<T>
, где T
- тип запрашиваемой сущности.
Вашему вопросу не хватает небольшого контекста, но, предполагая, что вы используете что-то вроде шаблона репозитория, вы можете сделать так, чтобы ваш базовый репозиторий выглядел следующим образом, с публично вызываемым методом, который, в свою очередь, вызывает абстрактный метод, который должен быть реализован производным классом. , перекладывая фактическую работу на более специализированный тип:
public abstract class BaseRepository<TEntity>
{
public async Task<ListReturnDTO<TEntity>> QueryDataAsync()
{
var items = new ListReturnDTO<TEntity>();
items.QueryStartTime = DateTime.UtcNow;
await QueryAndPopulateDataAsync(items);
items.QueryEndTime = DateTime.UtcNow;
return items;
}
protected abstract Task QueryAndPopulateDataAsync(ListReturnDTO<TEntity> container);
}
Если у вас есть один метод, который всегда вызывается, QueryDataAsync()
, который назначает свойства, которые вы всегда хотите назначить.
Теперь, чтобы реализовать реальный репозиторий, вы наследуете базовый и выполняете фактические запросы в QueryAndPopulateDataAsync()
:
public class ProductRepository : BaseRepository<Product>
{
protected override async Task QueryAndPopulateDataAsync(ListReturnDTO<TEntity> container)
{
container.TotalItem = 11;
........
container.data.Add(new Product { SKU = "000006", Description = "this is the test product 7, a rare breed of product", Price = 65.00, QuantityLeft = 3, Title = "Test Product 7", IsPreview = false });
container.data.Add(new Product { SKU = "000007", Description = "this is the test product 8, a rare breed of product", Price = 7.00, QuantityLeft = 30, Title = "Test Product 8", IsPreview = false });
//force a delay to replicate talking to external source
Thread.Sleep(2000);
}
}
И назовите это так:
var repo = new ProductRepository();
var data = await repo.QueryDataAsync();
И data
будут назначены свойства QueryStartTime
, QueryEndTime
и data
.