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

wx592a7561e9493 · · 433 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

参考链接: Magento-建筑

golang接口结构创建

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

  我已阅读以下文章:  

  https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html (鲍勃叔叔)  https://medium.com/hackernoon/golang-clean-archithecture-efd6d7c43047(Iman Tumorang-软件工程师)  https://medium.com/@eminetto/clean-architecture-using-golang-b63587aa5e3f(Elton Minetto-CTO)  

 

  

  

  摘要  

  如果您已经读过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接口结构创建



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:wx592a7561e9493

查看原文:golang接口结构创建_使用Golang创建干净的架构

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

433 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传