Re[8]: Несколько вопросов по Меппарам.
От: IT Россия linq2db.com
Дата: 10.05.05 03:33
Оценка:
Здравствуйте, igor_fle, Вы писали:

_>Если обобщить, то бизнес сущности должны максимально быть похоже на свой источник данных.


Да. Упрощается мапинг.

_>Никаким образом не должны пересекаться с DAL, не должны знать о своём происхождении.


Пересекаться они будут, но с другой стороны. DAL о них будет знать всё.

_>Бизнес сущности должны быть самодостаточными, т.е недопустимо чтобы за какой-то порцией данных было обращение к DAL, интересно а как-же с lozy load?


Это не так. Самодостаточность необязательное условие. Этак можно всю базу через одну сущность вытянуть. К тому же, если я вывожу списко из 1000 ордеров, то одновременное поднятие деталей без необходимости только нагрузит сервера и трафик. Сущности надо поднимать по мере необходимости. У меня обычно получается набор методов типа GetOrderByID, GetOrderDetailsByID, GetOrderListByCustomer и т.п. Первого метода может и не быть, но если есть, то он возвращает только одну записть из таблицы Order, второй метод поднимает Order и все его детали, Items, Addresses и т.п., третий деталей тоже не возвращает, только главные записи. Если мне нужны детали для конкретного ордера, то я вызову потом GetOrderDetailsByID. Но всё это, конечно же, зависит от задачи. Lazy loading я не использую. Красивая идея, но таит в себе множество подвохов. К тому же LL применяется в основном в системах построенных в стиле объектной модели (точнее в стиле пьяной обезъяны, по другому не назовёшь), я же здесь пропогандирую совершенно другой стиль

_>В моём случае получается, что функцию расчёта надо вынести из БО Company и перенести её в CompanyManager, который имеет отношение бизнес логике.


Точно.

_>Правильно ли расматривать БО, как плоский объект, который должен иметь самую примитивную логику.


Самую примитивную да. Что такое 'плоский' я плохо себе представляю.

_>Каждый БО должен иметь объект БЛ который оперирует им (CompanyManager <---> Company)


Интересный вопрос. Иногда это понимается именно так: один Manager — один БО. Тогда лучше думать о таких объектах как о сервисах: один Service — одна подсистема. Как правило такая подсистема обслуживает одну или несколько высокоуровневых сущностей и кучу вспомогательных. Например, OrderingService, всё о заказах.

_>Если у меня запрос состоит из нескольких таблиц, то как надо загружать БО? На каждую таблицу по БО или БО общий на запрос?


Что имеется ввиду, несколько таблиц в одном запросе (JOIN) или несколько запросов за один раз?

В случае с заказами (GetOrderDetailsByID) можно было бы написать такой спрок:

CREATE PROCEDURE GetOrderDetailsByID
    @OrderID int
AS

    SELECT
        Все_поля
    FROM
        Order
    WHERE
        OrderID = @OrderID
    
    SELECT
        Все_поля
    FROM
        OrderItem
    WHERE
        OrderID = @OrderID

GO


Далее DAL при использовании RFD получается примерно такой:

public Order GetOrderDetailsByID(int id)
{
    using (DbManager   db = new DbManager())
    using (IDataReader dr = db
        .SetSpCommand("GetOrderDetailsByID", id)
        .ExecuteReader())
    {
        if (rd.Next())
        {
            Order order = (Order)Map.ToObject(rd, typeof(Order));
            
            rd.NextResult();
            Map.ToList(order.Items, typeof(OrderItem));
            
            return order;
        }
    }
}


BL метод вырождается в pass-through.

IT>>Бизнес логика. Сервисы или менеджеры (как больше нравится). Всё взаимодействие с БД только через DAL. Никаких исключений. На этот уровень можно вынести только контроль транзакций. Классы BL строго stateless, никакого сохранения состояния между вызовами.


_>У меня есть объект DataManager, который абстрагирует работу с базой, правильно ли его создавать в етом слое и передабать объекту ДАЛ, или объект ДАЛ должен сам его создавать.


В случае с транзакциями его необходимо создавать в BL и передавать как параметер в DAL.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.