Magento2 API 服务合同设计模式 依赖注入 介绍
公共接口和API
什么是公共界面?
一个公共接口是一组代码,第三方开发者可以调用,实现或构建一个 插件 。Magento保证在没有重大版本更改的情况下,此代码在后续版本中不会更改。
模块的公共接口 标有@api
注释。
什么是API?
应用程序编程接口(API)是模块提供给其他模块的一组接口及其实现。
API类型
以下项目被视为API类型:
- 目录结构
- 配置文件结构
- 活动
- 客户端API
- 提供者 API (SPI)
目录结构和配置文件结构是API的类型,因为 扩展 开发人员使用它们。开发人员编写配置,并将其 静态文件 放在指定的文件夹中; 因此,如果配置文件结构或目录结构在后续版本中发生更改,则模块和扩展可能会中断。
服务合同设计模式
在编程社区中,设计模式是编写代码的推荐方式,包括何时使用或不使用模式。将 设计模式 视为具有条件的最佳实践。
服务契约的设计模式告诉您要定义哪些类型的接口,以及定义和实现这些接口的方式和位置。
服务合同数据接口现在是可变的。
接口类型和位置
一个 服务合同 必须定义数据接口,保持数据的完整性和服务接口,其中隐藏服务请求者的业务逻辑。
数据接口定义函数,这些函数返回有关数据实体的信息,返回搜索结果,设置验证规则并返回验证结果。您必须在模块的Api / Data子目录中 定义服务协定的数据接口 。
服务接口包括管理,存储库和 元数据 接口。您必须在模块的Api子目录中定义服务协定的服务接口。
数据接口
在模块的Api / Data子目录中定义数据接口。
例如,Customer模块的数据接口位于/ app / code / Magento / Customer / Api / Data子目录中。
数据搜索结果界面
将搜索条件传递给getList()
呼叫时,将返回搜索结果界面以及搜索结果。
您必须为每个数据实体定义一个接口以 进行类型提示。也就是说,getItems()
函数 CustomerSearchResultsInterface
返回一个CustomerInterface
数据实体数组。在GroupSearchResultsInterface
,该getItems()
函数返回一个GroupInterface
数据实体数组。
服务接口
服务接口包括几个接口子类型:
- 存储库接口
- 管理界面
- 元数据接口
对于文件名和编码标准,请遵循定义的PHP编码标准。
将服务接口放在模块的顶级Api目录中。
存储库接口
存储库接口提供对持久数据实体的访问。
例如,Customer模块的持久数据实体包括Customer,Address和Group。因此,Customer模块的存储库接口是:
CustomerRepositoryInterface
AddressRepositoryInterface
GroupRepositoryInterface
存储库接口必须提供以下功能:
功能 描述
save(data entity interface)
如果未指定ID,则创建记录。
如果指定了ID,则更新指定ID的记录。
get(id)
按ID执行数据库查找。
返回数据实体接口,例如
CustomerInterface
或AddressInterface
。
getList(search criteria)
执行搜索与指定搜索条件匹配的所有数据实体。
返回一个搜索结果界面,可以访问该组匹配项。
delete(data entity interface)
删除指定的实体。实体包含密钥(ID)。
deleteById(id)
按键(ID)删除指定的实体。
每个数据实体都有一个相应的接口。因此,get()
例如,相应接口中的函数可以返回确切的类型。
管理界面
管理界面提供与存储库无关的管理功能。例如:
接口 描述
AccountManagementInterface
定义
createAccount()
,changePassword()
,activate()
,和isEmailAvailable()
功能。
AddressManagementInterface
定义
validate()
验证地址的函数。
依赖注入
Magento 2使用依赖注入来替换Mage
Magento 1.x中类提供的功能。
依赖注入是一种设计模式,它允许对象A将其依赖关系声明为提供这些依赖关系的外部对象B. A声明的依赖关系通常是类接口,而依赖关系B提供的依赖关系是这些接口的具体实现。
这允许代码的松散耦合,因为对象A不再需要关心初始化它自己的依赖性。对象B基于配置或期望的行为决定向对象A提供哪些实现。
这是扩展开发人员理解的一个重要概念,因为它构成了Magento如何组成其类的基础。
依赖倒置原则
遵循依赖性反转原则并在代码中使用抽象来减少代码依赖性。这意味着您的高级类应该使用低级类的接口,而不是直接使用它们。
当Magento更改这些接口的底层实现时,在代码中使用接口可以降低不兼容性错误的风险。它还可以让您专注于类的功能而不是它的实现方式。
由于Magento代码库遵循此原则,因此您可以使用该di.xml
文件将自己的Magento接口实现映射到依赖类或服务。
对象管理器
这ObjectManager
是一个Magento服务类,它在引导过程开始时实例化对象。
Magento使用类构造函数签名来检索有关对象的构造函数依赖项的信息。构造类时,对象管理器将类的依赖项(在di.xml
文件中定义)注入到类构造函数中。
由于对象管理器间接提供其服务,因此您的类不应依赖于ObjectManager
对象本身。唯一的例外是具有复杂逻辑和集成测试的自定义工厂,需要进行环境设置。
编译依赖项
Magento使用其代码编译工具收集所有类依赖关系信息并将其存储在文件中。在类创建过程中,对象管理器使用此信息在应用程序中创建具体对象。
代码库中不存在的服务类,
例如: proxies, factories, and interceptors 在代码或配置中声明的,是在编译器的帮助下生成的。
Magento中使用的注入类型
以下代码示例突出显示了Magento中使用的两种依赖注入:
namespace Magento\Backend\Model\Menu;
class Builder
{
/**
* @param \Magento\Backend\Model\Menu\Item\Factory $menuItemFactory
* @param \Magento\Backend\Model\Menu $menu
*/
public function __construct(
Magento\Backend\Model\Menu\Item\Factory $menuItemFactory, // Service dependency
Magento\Backend\Model\Menu $menu // Service dependency
) {
$this->_itemFactory = $menuItemFactory;
$this->_menu = $menu;
} public function processCommand(\Magento\Backend\Model\Menu\Builder\CommandAbstract $command) // API param
{
// processCommand Code
}
}
- 构造函数注入在代码示例中,Builder类在其构造函数中声明其对Factory和Menu类的依赖性。Magento使用di.xml文件来确定要注入Builder类的实现。可选的依赖项可选依赖项是您的类用于特定方法和方案的对象。如果实例化类的代价很高,并且您的类并不总是使用它,请考虑使用代理。必须对对象的所有可选和必需依赖项使用构造函数依赖项注入。
- 方法注入在代码示例中,Builder类还依赖于CommandAbstract类的processCommand()方法。方法注入涉及将依赖项作为方法参数传递,以在类逻辑中使用它。当对象需要对无法注入的依赖项执行操作时,请使用方法注入。
依赖类型
注入
可注入对象是通过依赖注入获得的单件服务对象。对象管理器使用di.xml
文件中的配置来创建这些对象并将它们注入构造函数。
只要依赖关系链不循环回原始可注入对象,可注入对象就可以依赖于构造函数中的其他可注入对象。
Newable /非注入
新的或不可注射的对象是不能注入的对象。它们是通过每次需要时创建一个新的类实例获得的。
瞬态对象(例如需要来自用户或数据库的外部输入的对象)属于此类别。如果您尝试注入这些对象,您将收到一个不完整的,不正确的对象或无法创建该对象的错误。
例如,您不能依赖于模型对象,例如Product
,因为您需要提供产品ID或显式请求新的空实例来获取Product
对象。由于您无法在构造函数签名中指定此数据,因此Magento无法注入此对象。
为了解决这个限制,可注入对象可以依赖于生成可新对象的工厂。
Magento2 API 服务合同设计模式 依赖注入 介绍的更多相关文章
- ASP.NET Web API中的依赖注入
什么是依赖注入 依赖,就是一个对象需要的另一个对象,比如说,这是我们通常定义的一个用来处理数据访问的存储,让我们用一个例子来解释,首先,定义一个领域模型如下: namespace Pattern.DI ...
- AngularJS API之$injector ---- 依赖注入
在AngularJS中也有依赖注入的概念,像spring中的依赖注入,但是又有所不同.Spring中使用构造注入或者设值注入的方式,还需要做一些额外的操作,但是angular中只需要在需要的地方声明一 ...
- php设计模式-依赖注入模式(Dependency Injection)
依赖注入模式用来减少程序间的耦合.当一个类要使用另一个类时,一般的写法如下: <?php class Test1 { public function say() { echo 'hello'; ...
- C#设计模式 —— 依赖注入
在说依赖注入之前,先了解下什么是接口. 接口的相关规则: 1. 接口是一个引用类型,通过接口可以实现多重继承. 2. C#中接口的成员不能有new.public.protected.internal. ...
- ASP.NET Core 中的 依赖注入介绍
ASP.NET Core 依赖注入 HomeController public class HomeController : Controller { private IStudentReposito ...
- 使用Autofac在ASP.NET Web API上实现依赖注入
在ASP.NET Web API里使用Autofac 1.通过NuGet安装Autofac.WebApi(当时安装的是Autofac 3.1.0) PM > Install-Package Au ...
- 依赖注入[2]: 基于IoC的设计模式
正如我们在<控制反转>提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC自身不仅与面向对象没有必然的联系,它也算不上是一种设计模式.一般来讲,设计模 ...
- Spring升级案例之IOC介绍和依赖注入
Spring升级案例之IOC介绍和依赖注入 一.IOC的概念和作用 1.什么是IOC 控制反转(Inversion of Control, IoC)是一种设计思想,在Java中就是将设计好的对象交给容 ...
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
随机推荐
- 自定义工作流活动运行产生System.Security.SecurityException
摘要: 微软动态CRM专家罗勇 ,回复305或者20190224可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 最近碰到一个 ...
- arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- WLST Hangs Up Because of Java VM ClassLoader Deadlock
APPLIES TO: Oracle WebLogic Server - Version 10.0 to 10.3.6Information in this document applies to a ...
- (简单)华为荣耀9i LLD-AL20的Usb调试模式在哪里开启的方法
每当我们使用pc通过数据线连接上安卓手机的时候,如果手机没有开启Usb开发者调试模式,pc则没法成功检测到我们的手机,有时,我们使用的一些功能较好的应用如以前我们使用的一个应用引号精灵,老版本就需要开 ...
- .net DLL版本管理
每个DLL打上版本号,方便识别维护
- 并发框架Disruptor场景应用
今天用一个停车场问题来加深对Disruptor的理解.一个有关汽车进入停车场的问题.当汽车进入停车场时,系统首先会记录汽车信息.同时也会发送消息到其他系统处理相关业务,最后发送短信通知车主收费开始.看 ...
- ESP8266天线问题
http://www.icxbk.com/ask/detail/28832.html 目前市面上常见的外接天线包括 1.FPC天线,就是一小块柔性PCB,上面走一个铜线,下方不覆铜,然后一般带一个贴纸 ...
- Redis入门---字符串类型
阅读目录 1.keys * 命令 2.判断一个键是否存在(exists key) 3.删除键 4.获取键值的数据类型 5 递增数字(incr) 6.增加指定的整数 (INCRBY) 7.减少指定的整数 ...
- redis 基本原理及安装
一:什么是redis? Redis 是一个开源的,高性能的,基于键值对的缓存与存储系统.通过提供多种键值数据类型来适应不同场景下的缓存与存储需求. 二:redis数据库有什么优点? Redis数据库中 ...
- 可视化工具Grafana:简介及安装
随着业务的越发复杂,对软件系统的要求越来越高,这意味着我们需要随时掌控系统的运行情况.因此,对系统的实时监控以及可视化展示,就成了基础架构的必须能力. 这篇博客,介绍下开源的可视化套件grafana的 ...