Добрый день!
Как организовать взаимодейтсвие между сервисами в рамках одной транзакции на Business Logic Layer?
Прочитав множество статей, блогов, мануалов я не совсем понял, как же грамотно организовать работу сервисов + UoW + Repositories с учетом описанных ниже особенностей.
Сейчас реализована примерно ткакая архитектура:
Есть базовая реализация сервисов:
public abstract class BaseService<TUnitOfWork> : IService where TUnitOfWork : IUnitOfWork, new()
{
protected readonly IUnitOfWork _uow;
protected readonly ILogger _log;
public BaseService()
{
_uow = new TUnitOfWork();
_log = new Logger(GetType().FullName);
//...
}
// Other base protected & private methods
}
Есть два сервиса
public class FooService : BaseService, IFooService
{
public void CreateFoo(FooDTO foo)
{
FooEntity fooEntity = Mapper.Map<FooDTO, FooEntity>(foo);
// Insert Foo entity
_uow.FooRepository.Insert(fooEntity);
_uow.Commit();
}
}
public class BarService : BaseService, IBarService
{
public void CreateBar(BarDTO bar)
{
// Insert Bar entity
BarEntity barEntity = Mapper.Map<BarDTO, BarEntity>(bar);
_uow.BarRepository.Insert(barEntity);
// После чего необходимо вызвать FooService.CreateFoo(fooDTO)
IFooService fooService = ???
fooService.CreateFoo(new FooDTO()); // только для примера создается пустой FooDTO-объект
// При этом действие должно выполниться одной транзакцией
// т.е. полчается, что _uow.Commit() в методе FooService.CreateFoo не должен сработать,
// а должен сработать _uow.Commit для всех сущностей (и Bar и Foo) тот что ниже??
_uow.Commit();
}
}
Разные сервисы работают с разными UnitOfWork!
Весь этот подход реализован без использования DI.
Я не использую Dependency Injection так как не могу понять, как организовать следующие правила:
1) Разные сервисы могут использовать разные UnitOfWork (_uow), где интерфейсы ISomeUnitOfWork содержат следующие репозитории (как Generic, так и custom repository):
public interface IExampleUnitOfWork
{
IRepository<Foo> FooRepository { get; }
IBarRepository BarRepository { get; }
}
public class ExampleUnitOfWork : BaseUnitOfWork<ExampleContext>, IExampleUnitOfWork
{
public IRepository<Foo> FooRepository { get { return GetGenericRepository<Foo>(); } }
public IBarRepository BarRepository { get { return GetCustomRepository<BarRepository>(); } }
}
2) Сервисы могут иметь зависимости друг от друга, и выполнять методы сервисов, как в транзакции, так и без транзакции (последовательно)!!!
Огромная просьба помочь в освоении данной темы! Заранее благодарен любогй помощи!
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При компиляции выдаёт ошибку в коде: ConsoleWriteLine - Непредвиденный знак $
Программа по передаче файлов с помощью сокетов и TCP/IPВ документации Microsoft нашёл рабочий пример получения сообщения
Есть консольный скрипт (1), который при запуске пишет в базу свой PID полученный функцией getmypid()