Пытаясь реализовать 3 -уровня (, а не :уровня, я просто хочу логически разделить свой проект, на одной машине )архитектура я нашел так много разных подходов, что я запутался, что лучше способ (, если есть ), чтобы сделать это в приложении WinForms.
Теперь у меня не вызывает сомнений только 3 слоя, которые должны присутствовать в проекте:
В 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, просто 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);
}
}
Плюсы:
Минусы:
Итак, похоже, что бы я ни выбрал, я нарушу некоторые правила . Что лучше тогда, что я должен выбрать?Может быть, есть другой подход, который я не нашел?