Это скорее вопрос архитектуры / передового опыта, чем что-либо еще, поэтому, пожалуйста, не стесняйтесь добавлять свои два цента. Я знаю, что указал статус в заголовке, но это касается любого базового свойства объекта. Я думаю, что приведенный ниже пример учетной записи поможет лучше понять мой вопрос, чем статус.
Вот образец объекта 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 вместе с транзакцией, которую нужно добавить. Затем функция может использовать диспетчер истории для создания записей.
Хорошо, этот пост достаточно длинный. Если я недостаточно ясно выразился, дайте мне знать. Спасибо за ваш вклад.