Я только начал читать об использовании шаблонов репозитория и единицы работы. В настоящее время я пытаюсь использовать его с Entity Framework в приложении веб-форм asp.net. Однако у меня есть вопрос, который я не уверен, смогу ли объяснить простым способом.
Насколько я понимаю, единица работы используется для инкапсуляции бизнес-транзакции. Из примеров, которые я видел, uow используется следующим образом
businessMethod1()
{
uow u = new uow(); //instantiate unit of work
repository1 rep1 = new repository1(uow); //instantiate repository1
repository2 rep2 = new repository2(uow); //instantiate repository1
rep1.dowork();
rep2.dowork();
u.save(); //save the changes made to the database. (effectively saving changes made
//in both repository classes
}
Теперь предположим, что у меня есть businessMethod2()
, который похож на метод, описанный выше. Предположим, я хочу использовать businessMethod1()
изнутри businessMethod2()
, что было бы наилучшей практикой. Я хотел бы поделиться единицей работы, поэтому я должен передать ее в качестве аргумента? то есть измените метод, упомянутый выше, на
businessMethod1(uow u)
{
bool isNew = false;
if (u == null)
{
u = new uow();
isNew = true;
}
repository1 rep1 = new repository1(uow); //instantiate repository1
repository2 rep2 = new repository2(uow); //instantiate repository1
rep1.dowork();
rep2.dowork();
if (isNew)
u.save(); //save the changes made to the database.
}
Это правильный способ работы с этим?
Я думал, что лучшим способом было бы использовать singleton uow. При каждом запросе страницы создается новый экземпляр uow, который используется всеми бизнес-методами. При новом запросе создается другой экземпляр. Использование singleton uow означало бы, что мне не придется передавать его ни одному из моих бизнес-методов, и в то же время я могу поделиться им ч/б со всеми своими бизнес-методами.
Есть ли недостатки в этом? Также есть ли лучший способ реализовать это?