Какие объекты следует возвращать с уровня доступа к данным на бизнес-уровень с помощью системы n-уровня
Если у вас есть, например, таблица базы данных с именем Person (ID, Name и т.д.), какой тип объекта должен вернуть уровень доступа к бизнес-уровню?
Я думаю примерно так:
//data access tier
public class DataAccess{
public interface IPerson{
int ID{ get; set; }
string Name{ get; set; }
}
internal class Person : IPerson{
private int id;
private string name;
public int ID{ get{return id; } set{ id=value; } }
public int Name{ get{retutn name; } set{ name=value; }
}
public static IPerson GetPerson(int personId)
{
//get person record from db, populate Person object
return person;
}
}
//business tier
public class Person : IPerson{
private int id;
private string name;
public int ID{ get{return id;} set{id=value;} }
public string Name{ get{return name;} set{name=value;} }
public void Populate(int personId){
IPerson temp = DataAccess.GetPerson(personId);
this.ID = temp.ID;
this.Name = temp.Name;
}
}
Но все это кажется немного громоздким? Есть ли более элегантное решение этой проблемы? Должен ли я вернуть DataRow с уровня доступа к данным на бизнес-уровень?
Ответы
Ответ 1
Вам не нужно повторять определение класса на вашем уровне доступа к данным (DAL).
Вы можете создавать свои бизнес-объекты как "немые" контейнеры в отдельной сборке, например. ваш класс Person может просто быть: -
public class Person
{
int ID { get; set: }
string Name { get; set: }
}
Затем вы можете присвоить DAL ссылку на уровень бизнес-сущностей. Объекты вашего контроллера, независимо от того, находятся ли они на отдельном уровне бизнес-логики или на вашем уровне пользовательского интерфейса, могут просто вызвать DAL, который может создать бизнес-объект, заполнить его из базы данных и вернуть его на ваш контроллер.
Эта статья от Imar Spaanjaars имеет хорошее объяснение этого шаблона.
Ответ 2
Ваш бизнес-уровень определенно не хочет знать о строках данных - попробуйте оставить классы данных конкретным в слое данных. Это уменьшает сцепление и освобождает вас от изменения уровня персистентности позднее, без оптовой переструктурирования.
Чтобы решить вашу конкретную проблему, вы можете:
- Создайте базовые объекты данных/сущности в вашем слое данных и передайте их на свой бизнес-уровень для потребления.
- Или, как кажется, вы делаете, создавайте DTO (объекты передачи данных), которые существуют исключительно как средство передачи данных из уровня данных в более богатую реализацию вашего бизнес-объекта на более высоком уровне. Вы можете сделать это как часть шаблона репозитория в модели с богатым доменом.
Другая вещь, о которой вы могли бы подумать, - это уровни уровня v - это имеет значение, как вы думаете об этих вещах. Уровни обычно являются физическими, другими словами, они определяют границы между процессами. Слои обычно логичны, они отделяют функциональность программы от слабосвязанных единиц. В этом случае вы стремитесь к слоям.
Ответ 3
Если вы создаете интерфейсы для своих классов DAO и размещаете их в своем бизнес-уровне, вы можете ссылаться на свой бизнес-уровень на уровне доступа к данным. Классы DAO в объектах уровня данных возвращают объекты из бизнес-уровня.
Ваш бизнес-уровень ссылается на интерфейсы вместо прямого обращения к объектам доступа к данным. Инъекция зависимости через контейнер IoC (например, Castle Windsor, например) позволит вам выполнить это.
Этот метод называется разделенным сопряженным и описывается здесь:
http://www.martinfowler.com/eaaCatalog/separatedInterface.html
Лучшее объяснение этой техники, которую я видел, можно найти в этой статье о лучших практиках NHibernate, написанных Билли МакКафферти.
http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx
В статье много информации, которая является специфичной для NHiberbate, но хорошая ее половина - это просто твердая информация о том, что приложения должны быть слабо связаны и легко тестироваться.
Ответ 4
Как правило, каждый слой должен быть слабо связан с верхним уровнем, добавив ссылку BL на DAL, это не очень хорошая идея.
Его лучше определить модель данных в DAL с интерфейсом и сделать форму Business Entity в BL.
как мой опыт, лучше использовать репозиторий в DAL и получить доступ в вашем бизнес-сущности или бизнес-процессе.