У меня есть старая головоломка, вот я и подумал, что поделюсь ею с вами, может получиться правильно направление. Дело в том, что некоторые из наших сущностей в базе данных довольно большие (читай, имеют много свойств), и бизнес-логика редко использует все свойства сущности, поэтому каждый раз мне нужно думать, какие свойства должны быть загружены, чтобы бизнес-логика работала правильно. Очень гипотетический пример:
public class Product
{
public string Title {get;set;}
public string Description {get;set;}
public string RetailPrice {get;set;}
public string SupplierId {get;set;}
public Supplier Supplier { get;set;}
// many other properties
}
public class ProductDiscountService
{
public decimal Get(Product product)
{
// use only RetailPrice and Supplier code
return discount;
}
}
public class ProductDescriptionService
{
public string GetSearchResultHtml(Product product)
{
// use only Title and Description
return html;
}
}
Похоже, я мог бы извлечь интерфейсы IDiscountProduct и ISearchResultProduct, пометить продукт как реализующий эти интерфейсы, а затем создать меньшие DTO, реализующие каждый из этих интерфейсов, но на данный момент это выглядит излишним (по крайней мере, я не видел, как кто-то группирует свойства с помощью интерфейсов).
Разделять объект в базе данных на более мелкие объекты также не выглядит разумным, так как все эти свойства принадлежат продукту, и я боюсь, что мне придется использовать много объединений, чтобы выбрать что-то, и если я решу, что некоторые собственность принадлежит другому юридическому лицу, этот переход будет довольно сложно реализовать.
Использование каждого свойства в бизнес-логике конкретного метода в качестве параметра метода также выглядит плохим решением.