教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang接口结构创建_使用Golang创建干净的架构

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

发布时间:2022-02-18   编辑:jiaochengji.com
教程集为您提供golang接口结构创建,使用Golang创建干净的架构等资源,欢迎您收藏本站,我们将为您提供最新的golang接口结构创建,使用Golang创建干净的架构资源

golang接口结构创建

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

我已阅读以下文章:

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

<h2> 摘要 </h2>

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

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

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

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

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

<ul><li> 实体 </li><li> 用例 </li><li> 控制者 </li><li> 框架和设备 </li></ul>

在我的项目中划分层:

<ul><li> 楷模 </li><li> 用例 </li><li> 资料库 </li><li> 交货 </li></ul>

楷模:

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

<pre><code>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) }</code></pre>

用例

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

<pre><code>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{ <span class="hljs-attr">bookRepo</span> : 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 }</code></pre>

仓库

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

<pre><code>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 }</code></pre>

交付

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

<pre><code>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) { <span class="hljs-attr">handler</span> := &BookeHandler{ <span class="hljs-attr">BookUsecase</span> : 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, <span class="hljs-attr">_</span> := a.BookUsecase.Fetch(c.Request.Context()) c.JSON( 200 , gin.H{ "data" : books}) } func (a *BookeHandler) FindBook(c *gin.Context) { books, <span class="hljs-attr">_</span> := a.BookUsecase.GetByID(c.Request.Context(), c.Param( "id" )) c.JSON( 200 , gin.H{ "data" : books}) }</code></pre>

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

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

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

技术堆栈使用:

<ul><li> 戈姆 </li><li> 杜松子酒框架 </li><li> PostgreSQL </li><li> 毒蛇 </li><li> 清洁建筑 </li></ul>

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

<blockquote>

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

</blockquote>

golang接口结构创建

到此这篇关于“golang接口结构创建_使用Golang创建干净的架构”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang接口结构创建_使用Golang创建干净的架构
golang 动态生成函数_GoLang的优点和缺点
Golang 声明创建结构体 示例用法特点
使用Go语言一段时间的感受
golang 代码注释规范
golang基础教程
Golang结构体中Tag的使用
想系统学习GO语言(Golang
Golang基础第五篇——golang的gRPC
golang 扩展package 列表

[关闭]
~ ~