golang接口结构创建_使用Golang创建干净的架构

golang接口结构创建

嗨,大家好,我是前端开发人员。 在CMS Magento工作2年之前,我喜欢CMS Magento,因为系统干净,并且体系结构数据库EAV(实体-属性-值),但我不明白为什么我现在是开发前端(我不知道)知道)在2年的电流中。 而现在我有机会复出我喜欢的后端工作位置。

我已阅读以下文章:

摘要

如果您已经读过bob叔叔的文章,他说:>每层至少有一层用于业务规则,另一层则用于接口。

因此,这些体系结构中的每一个都会产生以下系统:

  • 独立于框架。 该体系结构不依赖于某些功能丰富的软件库的存在。 这使您可以将这些框架用作工具,而不必将系统塞入有限的约束中。
  • 可测试的。 可以在不使用UI,数据库,Web服务器或任何其他外部元素的情况下测试业务规则。 UI可以轻松更改,而无需更改系统的其余部分。 例如,可以在不更改业务规则的情况下用控制台UI替换Web UI。与数据库无关。 您可以将Oracle或SQL Server换成Mongo,BigTable,CouchDB或其他东西。 您的业​​务规则未绑定到数据库。独立于任何外部代理。 实际上,您的业务规则根本对外界一无所知。

详情见https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

在Bob叔叔的体系结构中,分为4层:

  • 实体
  • 用例
  • 控制者
  • 框架和设备

在我的项目中划分层:

  • 楷模
  • 用例
  • 资料库
  • 交货

楷模:

模型与实体相同。 它设置了数据结构,接口和方法,功能。 示例模型:书

import (
	"context"
)

// Book ...
type Book struct {
	ID     uint   `json:"id" gorm:"primary_key"`
	Title  string `json:"title"`
	Author string `json:"author"`
}

type BookUsecase interface {
	Fetch(ctx context.Context) ([]Book, error)
	GetByID(ctx context.Context, id string) (Book, error)
}

type BookRepository interface {
	Fetch(ctx context.Context) (res []Book, err error)
	GetByID(ctx context.Context, id string) (Book, error)
}

用例

该层将处理问题逻辑业务。 该层决定存储库将使用。 并负责为层交付使用提供数据。层用例取决于层存储库

import (
	"context"

	"github.com/working/project/domain"
)

type bookUsecase struct {
	bookRepo domain.BookRepository
}

// NewArticleUsecase will create new an articleUsecase object representation of domain.ArticleUsecase interface
func NewBookUsecase(a domain.BookRepository) domain.BookUsecase {
	return &bookUsecase{
		bookRepo : a,
	}
}
func (a *bookUsecase) Fetch(c context.Context) (res []domain.Book, err error) {
	res, err = a.bookRepo.Fetch(c)
	if err != nil {
		return nil, err
	}
	return
}

func (a *bookUsecase) GetByID(c context.Context, id string) (res domain.Book, err error) {
	res, err = a.bookRepo.GetByID(c, id)
	return
}

仓库

该层将处理数据库方法:获取,放置,删除,获取等。层级责任将选择数据库在应用程序中的使用。 可以是Mysql,Postgresql,MongoDB,MariaDB等

import (
	"context"

	"github.com/jinzhu/gorm"

	"github.com/working/project/domain"
)

type psqlBookRepository struct {
	Conn *gorm.DB
}

// NewMysqlArticleRepository will create an object that represent the article.Repository interface
func NewPsqlBookRepository(Conn *gorm.DB) domain.BookRepository {
	return &psqlBookRepository{Conn}
}

func (m *psqlBookRepository) Fetch(ctx context.Context) (res []domain.Book, err error) {
	var books []domain.Book
	m.Conn.Find(&books)

	return books, nil
}
func (m *psqlBookRepository) GetByID(ctx context.Context, id string) (res domain.Book, err error) {
	var book domain.Book
	m.Conn.Where( "id = ?" , id).First(&book)
	return book, nil
}

交付

该层将决定如何显示数据。 可以是REST API,HTML或gRPC(无论决策类型是什么)。此布局接受用户输入并发送层用例句柄逻辑

import (
	"github.com/gin-gonic/gin"
	"github.com/working/project/domain"
)

type BookeHandler struct {
	BookUsecase domain.BookUsecase
}

func NewBooksHandler(r *gin.RouterGroup, us domain.BookUsecase) {
	handler := &BookeHandler{
		BookUsecase : us,
	}
	r.GET( "/books" , handler.FindBooks)
	// r.POST("/books", handler.CreateBook)       // create
	r.GET( "/books/:id" , handler.FindBook) // find by id
	// r.PATCH("/books/:id", handler.UpdateBook)  // update by id
	// r.DELETE("/books/:id", handler.DeleteBook) // delete by id
}

func (a *BookeHandler) FindBooks(c *gin.Context) {
	books, _ := a.BookUsecase.Fetch(c.Request.Context())
	c.JSON( 200 , gin.H{ "data" : books})
}

func (a *BookeHandler) FindBook(c *gin.Context) {
	books, _ := a.BookUsecase.GetByID(c.Request.Context(), c.Param( "id" ))
	c.JSON( 200 , gin.H{ "data" : books})
}

目前,我的项目基于以下4层构建:模型,用例,存储库和交付。 而我的项目面试,我觉得不好。 我将在下一篇文章中重建体系结构项目。

您应该了解某人的体系结构并在您的项目中接受它。 那会让您看起来不错,并记住从简单开始

链接项目: https //github.com/caohoangnam/go-clean-architecture

技术堆栈使用:

  • 戈姆
  • 杜松子酒框架
  • PostgreSQL
  • 毒蛇
  • 清洁建筑

如果您有一个问题,或者需要更多说明,或者其他我无法在此处很好地解释的问题,您可以通过 链接 发送电子邮件 来询问 我。 非常感谢。

翻译自: https://hackernoon.com/creating-clean-architecture-using-golang-9h5i3wgr

golang接口结构创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值