3 -многоуровневая архитектура -передача данных между уровнями

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

Теперь у меня не вызывает сомнений только 3 слоя, которые должны присутствовать в проекте:

  • Пользовательский интерфейс (Уровень представления)
  • BLL (Уровень бизнес-логики)
  • DAL (Уровень доступа к данным)

В UI ставлю все WinForms. Также должна быть какая-то логика для заполнения объекта данными из элементов управления и передачи их на уровень BLL.

В DAL хочу поместить классы и методы для манипуляций с данными с помощью ADO.NET,как:

public class OrderDAL
{
    public OrderDAL()
    {
    }

    public int Add(Order order)
    {
        //...add order to database
    }

    public int Update(Order order)
    {
        //...update order in database
    }

    //...etc.
}

Проблема с BLL и вопрос -должен ли я использовать объекты передачи данных для передачи данных между слоями, или я должен передать весь класс?

Если я решу использовать DTO , мне нужно будет создать дополнительный общий класс Order, ссылающийся на UI, BLL и DAL :

public class Order
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public string Number { get; set; }
    public string CustomerName { get; set; }

    public Order ()
    {
    }
}

. и поместите логику разделенную в BLL:

public class OrderBLL
{
    public OrderBLL()
    {
    }

    public int Add(Order order)
    {
        OrderDAL orderDAL = new OrderDAL();
        return orderDAL.Add(order);
    }

    public int Update(Order order)
    {
        OrderDAL orderDAL = new OrderDAL();
        return orderDAL.Update(order);
    }

    //...etc.
}

Этот подход под разными названиями используется среди прочих:здесь или здесь .
С другой стороны, некоторым "умникам" и их последователям (нравится здесь)назовите ее Anemic Domain Model и жалуйтесь, что это плохой дизайн и анти-паттерн -, который не следует использовать.

Плюсы:

  • DTO может легко представлять таблицу базы данных,
  • он легкий и понятный, содержит только поля, необходимые для базы данных,
  • DAL не обязательно должен ссылаться на BLL,

Минусы:

  • анти -паттерн (звучит страшно ;P ),
  • нарушение ООП (отдельные свойства от методов ),
  • поскольку логика находится в другом классе, ее может быть сложнее поддерживать, когда что-то меняется.

Таким образом, противоположный подход заключается в передаче всего объекта между слоями, как здесь:нет DTO, просто BLL выглядит вот так:

public class Order
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public string Number { get; set; }
    public string CustomerName { get; set; }

    public Order()
    {
    }

    public int Add()
    {
        OrderDAL orderDAL = new OrderDAL();
        return orderDAL.Add(this);
    }

    public int Update(Order order)
    {
        OrderDAL orderDAL = new OrderDAL();
        return orderDAL.Update(order);
    }
}

Плюсы:

  • это красиво инкапсулированный объект, следующий правилам ООП (я полагаю ; )).
  • и логика, и свойства находятся в одном месте, их легче поддерживать и отлаживать.

Минусы:

  • чтобы использовать объект, DAL должен ссылаться на BLL (, это не то, как должен работать уровень 3 -, не так ли? ).
  • class может содержать некоторые поля, которые не используются в базе данных, а также некоторые поля из базы данных (, такие как Id ), не представляют объект «реальной жизни».

Итак, похоже, что бы я ни выбрал, я нарушу некоторые правила . Что лучше тогда, что я должен выбрать?Может быть, есть другой подход, который я не нашел?

6
задан mj82 29 June 2012 в 09:54
поделиться