C# Как организовать взаимодейтсвие между сервисами в рамках одной транзакции на Business Logic Layer?

258
25 февраля 2017, 03:04

Добрый день!

Как организовать взаимодейтсвие между сервисами в рамках одной транзакции на 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) Сервисы могут иметь зависимости друг от друга, и выполнять методы сервисов, как в транзакции, так и без транзакции (последовательно)!!!

Огромная просьба помочь в освоении данной темы! Заранее благодарен любогй помощи!

READ ALSO
Basic-аутентификация с помощью C#

Basic-аутентификация с помощью C#

При выполнении выдаёт ошибку:

220
Непредвиденный знак $

Непредвиденный знак $

При компиляции выдаёт ошибку в коде: ConsoleWriteLine - Непредвиденный знак $

492
Как получить файл через socket в UWP(Windows 10)

Как получить файл через socket в UWP(Windows 10)

Программа по передаче файлов с помощью сокетов и TCP/IPВ документации Microsoft нашёл рабочий пример получения сообщения

242
Узнать запущен ли процесс по PID

Узнать запущен ли процесс по PID

Есть консольный скрипт (1), который при запуске пишет в базу свой PID полученный функцией getmypid()

430