В настоящее время я использую несколько репозиториев и несколько подходов UnitOfWork. Допустим, у вас есть CustomerRepository и InvoiceRepository. Если вам нужно сделать это:
customerRepository.Add(customer);
invoiceRepository.Add(bill);
и эти два в качестве транзакции, то, что я делаю, это при создании хранилища, я даю им тот же UnitOfWork, как:
IUnitOfWork uow = UnitOfWork.Start();
ICustomerRepository customerRepository = new CustomerRepository(uow);
IInvoiceRepository invoiceRepository = new InvoiceRepository(uow);
так что приведенные выше утверждения теперь:
customerRepository.Add(customer);
invoiceRepository.Add(bill);
uow.Commit();
Вся магия ниже, зависит от того, что вы используете в качестве технологии данных (или ORM, например, NHibernate, или, возможно, необработанный ADO.NET - и это не рекомендуется в большинстве случаев).
Для хорошего примера по шаблону репозитория и UnitOfWorks, пройдите это руководство , но обратите внимание, что в нем не может быть несколько активных UnitOfWorks (и на самом деле лишь немногие приложения нуждаются в этом, поэтому никаких реальных проблем нет ).
Кроме того, в учебном пособии используется NHibernate, поэтому, если вы не знакомы с концепцией ORM, я предлагаю вам в нее войти (если ваше расписание это позволяет).
еще одна вещь: у вас также есть более продвинутые шаблоны, такие как сеанс на разговор и т. Д., Но это продвинутый материал, в который я сейчас завершаюсь, если вы хотите взглянуть на проекты uNhAddIns ( для NHibernate также)