Сущности делают слишком много?

У меня есть старая головоломка, вот я и подумал, что поделюсь ею с вами, может получиться правильно направление. Дело в том, что некоторые из наших сущностей в базе данных довольно большие (читай, имеют много свойств), и бизнес-логика редко использует все свойства сущности, поэтому каждый раз мне нужно думать, какие свойства должны быть загружены, чтобы бизнес-логика работала правильно. Очень гипотетический пример:

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, реализующие каждый из этих интерфейсов, но на данный момент это выглядит излишним (по крайней мере, я не видел, как кто-то группирует свойства с помощью интерфейсов).

Разделять объект в базе данных на более мелкие объекты также не выглядит разумным, так как все эти свойства принадлежат продукту, и я боюсь, что мне придется использовать много объединений, чтобы выбрать что-то, и если я решу, что некоторые собственность принадлежит другому юридическому лицу, этот переход будет довольно сложно реализовать.

Использование каждого свойства в бизнес-логике конкретного метода в качестве параметра метода также выглядит плохим решением.

7
задан Giedrius 31 May 2012 в 07:13
поделиться