如何确保我们的业务服务使用与服务堆栈服务相同的数据库连接

How to ensure our business-service is using the same db connection as the servicestack-service

我们确实有一些业务服务需要 IDBConnection。 这些服务确实使用与 'normal' Service-Stack 服务相同的 dbconnection,这一点非常重要,因此我们确实有原子事务。

我们目前针对这个问题的解决方案是,在servicestack-service构造函数中实例化业务服务(使用servicestack提供的IDbConnection)

        private readonly ITaskService _taskService;

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

但是,我觉得这不是很好 'smart',可能有更好的解决方案,但我现在忽略了。

注入 DbFactory 而不是普通连接会有更好的选择吗?如果是这样,DbFactory 是否已经解决了这个问题?

最佳,
丹尼尔

如果您需要使用与 ServiceStack 服务相同的开放 Db 连接,您应该从您的服务中传入它,例如:

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

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

或者,您可以覆盖 AppHost 中的 GetDbConnection() 以使其 return 与该请求的相同数据库连接,例如:

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>();
    }
}