Бизнес-объекты C# и наборы

Я испытываю затруднения при обертывании моей головы вокруг бизнес-объектов или более конкретно, наборы бизнес-объекта.

Вот быстрый пример того, что я пытаюсь сделать.

Если у меня есть Инцидентный Объект, этот объект может иметь много вовлеченных людей, и каждый из тех объектов Человека может иметь несколько примечаний. Примечания не могут существовать без объекта Человека, и объекты Человека не могут существовать без Инцидентного Объекта.

Если я имею Общедоступный Список <Примечание> примечания = новый Список <Примечание> () затем методы, такие как ADD и УДАЛЯЮ, становятся доступными Человеку в рамках Инцидента. Я предполагаю, что, если я должен был назвать те методы на наборе Примечаний, он просто удалит его из Списка, но не выполнит любой код для фактического добавления/обновления/удаления сотрудника от источника данных. Это приводит меня полагать, что я не должен использовать Список, но что-то еще?

Это также приводит меня к другому вопросу. Где фактические операции базы данных CRUD должны находиться. Объект Примечания должен иметь свой собственный CRUD, или Человек должен возразить быть ответственным за него, так как он не может существовать без него?

Я немного потерян, о котором способе пойти и я хотел бы разобраться в этой части, потому что это будет шаблон для остальной части программы.

6
задан Peter Mortensen 19 March 2011 в 16:32
поделиться

3 ответа

[11946446- [11946446-

Некоторая отличная информация была дана, но одна вещь, которую вы упомянули, что может быть запутанно, вы это:

», если у меня есть открытыми списками = NEW Список (), то такие методы, как добавить, Удалить стать доступным для человека Внутри инцидента. "

, что все зависит от того, как вы разработаете свои классы. Одна вещь, о которой вы должны подумать о том, как эти данные относятся друг к другу. Это поможет вам представить свой дизайн класса.

Это звучит как Следующее:

  • Один инцидент может включать множество людей
  • Один человек может создать многие примечания
  • Примечание - самый низкий уровень и существует из-за создания создания инцидента и ответственным лицам, работающим на этом инциденте.

Инцидент 1 - Многие люди

Человек 1 - Многие замечания

Вы можете сделать этот тип отношений несколькими способами. Одним из способов, возможно, на самом деле отделяют участие объекты, а затем создают объединенные объекты.

Например,

public class Incident {
//insert incident fields here
//do not add person logic / notes logic
//probably contains only properties
}

public class Person {
//insert person fields
//private members with public properties
//do not embed any other logic
}

public class Comment {
 //insert comment private fields
 //add public properties
 //follow the law of demeter
}

Эти классы не дают подробности друг другу, они просто репозитории для хранения этой информации. Затем вы связываете эти классы друг к другу, например

public class IncidentPersonnel {
List<Person> p;
//add methods to add a person to an incident
//add methods to remove a person from an incident
....
}

, тогда у вас может быть другой класс, обрабатывающий комментирование персоналом

public class PersonnelNotes {
List<Note> n;
//other methods...
}

Вы можете пойти дальше с этим, но оно может осложнить вещи, но я просто Жин G Вы еще одно представление о том, как справиться с этим.

Попытайтесь следовать Закон Демитера для функций

Инкционируют все свои объекты, кроме того, ваш сосед может говорить с вами, но не намного больше ... это поможет сохранить ваши классы свободно связаны и делает Процесс мысли немного проще для вас.

Наконец, вы упомянуте, как работают операции CRUD. Это все восходит к вашему DAL (уровень доступа к данным). Скорее, затем возвращает строки данных из таблицы, которые вы могли бы вернуть ссылочный объект со всеми его атрибутами. Добавьте и удалите работу так же (прохождение или выход объекта). Вы можете использовать ORM или записать свой DAL. Все зависит от того, насколько вы хотите привлечь себя :).

1
ответ дан 17 December 2019 в 18:16
поделиться

Способ, которым я это делаю, следующий: каждый объект, имеющий дочерние объекты, содержит их список, а каждый объект, имеющий родительский, содержит свойство с его типом. Добавление осуществляется путем заполнения объекта (или иерархии объектов) и отправки в DAL для сохранения при желании. Все операции CRUD находятся в DAL, который является агностичным по типам объектов, но использует такие типы для определения того, к каким таблицам, столбцам и т.д. можно получить доступ. Удаление - это единственное, с чем можно справиться по-другому, установив свойство Deleted объекта, которое вызывает DAL для его удаления.

Что касается бизнес-логики, то не находится с самими объектами (DAO), а осуществляется классами, которые получают или собирают такие DAO, когда это необходимо, выполняют свою работу и отправляют DAO обратно в DAL для обновления.

1
ответ дан 17 December 2019 в 18:16
поделиться

У вас здесь есть несколько разных вопросов, я постараюсь ответить больше всего.

В отношении проблем с использованием списка - каркас имеет ReadonlyCollection , которая полезна в вашей ситуации. Это коллекция, которая не позволяет добавлять или удалять после создания.

В отношении ответственности в трудную операцию - это должно принадлежать к вашему слое данных, а не какие-либо из ваших объектов (см. SRP - единственный принцип ответственности).

1
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: