0

我正在编写一个可以进行事务查询的服务,(在这个问题中我将使用 GORM)

用户服务

type userService struct {
    UserRepository  repository.IUserRepository
    TokenRepository repository.ITokenRepository
}

type IUserService interface {
WithTrx() IUserService
CommitTrx() error
RollbackTrx()

Create(ctx context.Context, name string) (*model.User, error)
...
...
}

这是该服务的一些实现

用户.go

func (s *userService) WithTrx() IUserService {
    newService := &userService{
        UserRepository:       s.UserRepository.WithTrx(),
        TokenRepository:      s.TokenRepository,
    
    }
    return newService
}
func (s *userService) Create(ctx context.Context, name string) (*model.User, error) {
... 
// s.UserRepository.Create() 
// then return the user, error 
...
}


而对于 UserRepository.WithTrx() 基本上只是返回接口本身

type psqlUserRepository struct {
    DB *gorm.DB
}

type IUserRepository interface {
    WithTrx() IUserRepository
    CommitTrx() error
    RollbackTrx()

    Create(ctx context.Context, u model.User) (*model.User, error)
...
}

func (r *psqlUserRepository) WithTrx() IUserRepository {
    return &psqlUserRepository{DB: r.DB.Begin()}
}

因此,当我需要用户服务来使用事务查询创建用户时,我只是:


trx:= userserviceInstance.WithTrx()
user, err := trx.Create(ctx, name)
// err handling and rollback
commitErr := trx.CommitTrx()

有没有类似的方法?这叫什么?我不确定这是否是创建事务查询的正确模式。

4

1 回答 1

1

我想这里有一些时刻。

存储库模式通常用于隐藏存储的实现细节。

交易是一个技术细节,不应该暴露给更高层。

换句话说,您拥有的存储库接口(架构元素)不应该公开事务(技术细节)。

有没有类似的方法?这叫什么?我不确定这是否是创建事务查询的正确模式您可能想了解更多关于工作单元模式的信息,这对您的目的很有用。

您可以查看工作单元模式。

下面是一些您可能会觉得有用的示例:

于 2021-07-06T13:52:12.360 回答