Я подхожу к своей стороне запроса следующим образом: -
У меня есть пространство имен, которое представляет мои объекты запроса, чтобы не конфликтовать с моим доменом.
Домен может быть чем-то вот так:
namespace Product
{
public class Order
{
public Guid Id { get; }
public DateTime RegisteredDate { get; }
public Order(Guid id, DateTime registeredDate)
{
Id = id;
RegisteredDate = registeredDate;
}
}
}
Модель чтения будет выглядеть примерно так (обратите внимание на вложенный класс Specification
):
namespace Product.DataAccess.Query
{
public class Order
{
public class Specification
{
public Guid? Id { get; private set; }
public DateTime? RegisteredDateStart { get; private set; }
public DateTime? RegisteredDateEnd { get; private set; }
public Specification WithId(Guid id)
{
Id = id;
return this;
}
public Specification WithRegisteredDateStart(DateTime registeredDateStart)
{
RegisteredDateStart = registeredDateStart;
return this;
}
public Specification WithRegisteredDateEnd(DateTime registeredDateEnd)
{
RegisteredDateEnd = registeredDateEnd;
return this;
}
}
public Guid Id { get; set; }
public DateTime RegisteredDate { get; set; }
}
}
В моем уровне запроса I передайте спецификацию, и уровень запроса может затем построить запрос, используя значения спецификации:
namespace Product.DataAccess
{
public interface IOrderQuery
{
IEnumerable<Query.Order> Search(Query.Order.Specification specification);
int Count(Query.Order.Specification specification);
}
}
Таким образом, у вас есть явное требование, переданное вашему уровню запроса, и вы реорганизуете свой класс спецификации и реализацию запроса когда вам нужны дополнительные параметры запроса.