Это больше вопрос архитектуры / лучших практик, чем что-либо еще, поэтому, пожалуйста, не стесняйтесь добавлять свои два цента. Я знаю, что я указал статус в заголовке, но это касается любого базового свойства объекта. Я думаю, что приведенный ниже пример аккаунта поможет продемонстрировать мой вопрос немного лучше, чем статус.
Вот пример объекта Account:
public class Account
{
private IList<Transaction> _transactions;
public AddTransaction(trans as Transaction)
{
_transaction.add(trans)
}
}
Теперь допустим, что я хочу начать вести историю каждого добавления транзакции с этим объектом.
public class AccountHistory
{
private DateTime _historyDate;
private String _details;
public AccountHistory(string details)
{
_historyDate = DateTime.Now;
_details = details;
}
}
На этом уровне я обычно добавляю коллекцию событий истории в объект учетной записи, а также добавляю строку кода для создания события истории внутри метода AddTransaction (), например
public AddTransaction(trans as Transaction)
{
_transaction.add(trans);
**_historyEvents.add(new AccountHistory("Transaction Added: " + trans.ToString());**
}
Теперь следующая часть, где проблема начинает возникать. Предположим, что я хочу сделать массовую публикацию и хочу сохранить запись о том, какие учетные записи были изменены в этой массовой публикации для чего-то вроде отчета или если мне нужно было отменить его позже. Поэтому я бы создал такой объект.
public class HistoryGroup()
{
private IList<AccountHistory> _events;
}
Отсюда я вижу несколько разных опций, чтобы справиться с этим, так как это не может быть обработано приведенным выше кодом.
1) Создайте функцию в объекте типа Service, который просматривает список учетных записей, вызывающих метод AddTransaction (), а также создает записи истории, связанные с HistoryGroup
public void AddTransactions(IList<Account> accounts, Transaction trans)
{
HistoryGroup history = new HistoryGroup();
for (int x=0;x <=accounts.Count - 1; x++)
{
accounts(x).AddTransaction(trans);
history.AddEvent(new AccountHistory("Added Transaction: " + trans.ToString();
}
}
2) Передайте некоторый тип объекта HistoryManager в метод AddTransaction вместе с транзакцией, которая будет добавлена. Затем функция может использовать менеджер истории для создания записей.
Хорошо, этот пост достаточно длинный. Если я не был достаточно ясен, дайте мне знать. Спасибо за ваш вклад.