Re[5]: Domain Model, мапперы и отчеты
От: Aikin Беларусь kavaleu.ru
Дата: 21.04.08 06:51
Оценка:
A>>Что-то мне не нравиться смешивание домена и чистых данных (ДатаТэйбл). Что мешает вместо дататэйбла испольовать коллекции? Коллекции отлично биндятся на любые контролы (Forms или ASP).

А>там есть ряд моментов.

А>Во-первых, насколько знаю, коллекции все-таки не так уж и удобно биндить в грид — поля объекта высвечиваются в гриде в виде своего метода ToString(), а мне иногда нужно только какое-нибудь одно его поле, а не все строковое представление (ну например светим в грид объект аккаунт, который содержит параметры подключения, так вот для объекта ПараметрыПодключение мне надо не один столбец, а несколько, что-бы пользователь мог легче их просматривать
Не обязательно доменные объекты напрямую биндить на гриды. За пол часа можно наваять SomeObjectInfo который предоставит доступ только к нужным элементам.

А>и сортировать (кстати стандартный List<> вообще сортировку и фильтрацию не поддерживает, это самому похоже надо приделывать, и спрашивается нафига это делать, если куда проще взять готовый DataTable ?))

Сортировку по любому полю легко сделать самостоятельно (см. конец поста).
А с фильтрацией действительно траблы. Хотя ничего не стоит получать данные уже отфильтрованными (да не всегда удобно, но это "не всегда" всего 5% от всех запростов) (девекспресовский грид умеет сам фильтровать и сортировать, правда он платный, зараза).

А>Во-вторых какой вообще смысл полученные строки превращать в объекты — на стадии поиска нужного клиента или аккаунта мне нужны только их идентификаторы. Собирание из них объектов только будет занимать время и память. А если их еще и закэшировать, так и вся оперативка забъется объектами, 99% которых в сеансе даже не потребуются.

Сборка объекта не стоит ничего по сравнению с обращением к базе.
Про идентефикаторы ничего не понял
В большинстве случаем память занимаемая объектом == памяти занимаемой всеми его частями (ну может еще несколько байт, но это фигня).
Никто не говорит, что нужно забрать из базы все что касается искомого объекта. Есть Lazy Load.

А>В третьх, некоторые запросы возвращают данные, которые не относяться к существующим объектам, например суммарное количество заявок клиента за полгода. Тут и вообще никуда не деться

Действительно. Нужно обдумать эту мысль.

И все же хочу уточнить, что я не против ДатаТэйблов. Когда нужно просто посмотреть и отредактировать данные по скорости и удобству (поддержка .Net) им нет равных, но вот когда в просмотр и редактирование вкрадывается логика... Лучше сразу от них отказываться (ИМХО).

P.S.
    public class GenericComparer<T> : IComparer<T>
    {
        private int _directionMylt = 1;
        private PropertyInfo _sortPropertyInfo;
        private Comparer _internalComparer = new Comparer(CultureInfo.CurrentUICulture);
        public GenericComparer(string sortByProperty, SortDirection direction)
        {
            _sortPropertyInfo = typeof(T).GetProperty(sortByProperty);

            if(_sortPropertyInfo == null)
            {
                throw new ArgumentException("There is no property '" + sortByProperty + "' in " + typeof(T).ToString());
            }
            
            switch (direction)
            {
                case SortDirection.Ascending:
                    _directionMylt = +1;
                    break;
                case SortDirection.Descending:
                    _directionMylt = -1;
                    break;
            }
        }

        private object GetValueToCompare(T instance)
        {
            return _sortPropertyInfo.GetValue(instance, null);
        }

        private int InternalCompare(T x, T y)
        {
            object xValue = GetValueToCompare(x);
            object yValue = GetValueToCompare(y);

            return _internalComparer.Compare(xValue, yValue);
        }

        public int Compare(T x, T y)
        {
            return _directionMylt * InternalCompare(x, y);
        }
    }
... << RSDN@Home 1.2.0 alpha 4 rev. 1067>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.