Как убедиться, что наш бизнес-сервис использует то же соединение с БД, что и сервисный стек - PullRequest
1 голос
/ 18 октября 2019

У нас есть несколько бизнес-сервисов, для которых требуется IDBConnection. Очень важно, чтобы эти сервисы использовали то же самое соединение db, что и «нормальный» сервис Service-Stack, поэтому у нас есть атомарные транзакции.

Наше текущее решение для этой проблемы - создать бизнес-сервис в стеке сервисов. -service конструктор (с использованием IDbConnection, который предоставляет servicetack)

        private readonly ITaskService _taskService;

        public RegistrationService(IEmailService emailService, ITextProvider textProvider)
        {
            this._taskService = new TaskService(Db);
        }

Однако я чувствую, что это не очень «умно», и, возможно, есть более подходящее решение, которое я пропускаю прямо сейчас.

Будет ли лучшим вариантом внедрить DbFactory вместо простого соединения? Если да, то DbFactory уже решает эту проблему?

Best,
Daniel

1 Ответ

1 голос
/ 18 октября 2019

Если вам нужно использовать то же открытое Db соединение, что и в ServiceStack Service, вы должны передать его из своей службы, например:

public class MyServices : Service
{
    public IMyDep MyDep { get; set; }

    public object Any(MyRequest request)
    {
        MyDep.Method(Db);
    }
}

В качестве альтернативы вы можете переопределить GetDbConnection() в вашемAppHost, чтобы он возвращал то же самое соединение с БД для этого запроса, например:

public override IDbConnection GetDbConnection(IRequest req = null)
{
    if (req != null)
    {
        if (req.Items.TryGetValue("RequestDb", out var oDb) && oDb is IDbConnection db)
            return db;
        db = base.GetDbConnection(req);
        req.Items["RequestDb"] = db;
        return db;
    }
    return base.GetDbConnection(req);
}

К которому в ваших зависимостях можно получить доступ с AppHost.GetDbConnection(), например:

public class MyDep : IMyDep 
{
    private IDbConnection db;
    public virtual IDbConnection Db => db ?? (db = HostContext.AppHost.GetDbConnection(Request));

    public object Method()
    {
        var row = Db.Select<Table>();
    }
}
...