phalapi可以依赖注入么_DI依赖注入和单例模式.pdf

DI依赖注入和单例模式

DI依赖注⼊和单例模式

PHALAPI-进阶篇2(DI依赖注⼊和单例模式)

前⾔

先在这⾥感谢phalapi框架创始⼈@dogstar,为我们提供了这 ⼀个优秀的开源框架.

离上⼀次更新过去了快两周,在其中编写了⼀个关于DB分表分库解决⼤数据量的拓 ,

有兴趣的童鞋可以了解了解.废话不多说,本⼩节在于解释⼀下在PhalApi框架中两个⽐

较好的思想,单例模式和依赖注⼊.

附上:

喵了个咪的博客:

官⽹地址:/

开源中国Git地址:/dogstar/PhalApi/tree/release

1. 单例模式

单例模式对于长期进⾏过⾯向对象编程的童鞋应该不算陌⽣,对学习php的童鞋也应该

有听过,这⾥简单的聊⼀聊单例模式它到底是⼀个怎么样的东东,解决了怎么样的问题,

并且在PhalApi中它是如何实现的.

单例单例,所谓单例也就是保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问

点,这就是单例,不难看出他的好处:资源利⽤少,因为只有⼀个,⼤家都是知道要使⽤

⼀个类必须要实例他,也就是new,在每次new⼀个对象的时候都会在内存中⽣成⼀块

区域来存放这个实例,如果在程序⼀次运⾏中使⽤了很多的new实例化了同⼀个对象,那

就⽐较消耗资源了,但是如果是通⽤⼀个使⽤全局变量global程序又会显得不那么优雅

⽽且会很乱,在这种情况下,单例模式就产⽣了.

单例模式是⼀个很好的解决⽅案,既可以全局通⽤,又不必担⼼占⽤过多的资源,且⾮

常优雅。我们来⼀起看看在PhalApi中是如何实现单例模式的:

//⼤家看到我们常⽤的DI⽅法内部实现的是PhalApi_DI中的静态⽅法one⽅法

function DI() {

return PhalApi_DI::one();

}

然后我们看向one⽅法内部

每当请求过来时先验证静态变量instance是否已被类初始化赋值,若⽆,则会在内部去

实例化PhalApi_DI类,然后赋值给$instance并返回,若有,则当下次请求过来时,直接

返回已实例化的对象。简⾔之,PhalApi框架所有的地⽅使⽤的DI⽅法,其实都是返回

同⼀个对象实例,在内存中只存在⼀块区域,代码如下:

public static function one(){

if(self::$instance == N LL){

self::$instance = new PhalApi_DI();

self::$instance->onConstruct();

}

return self::$instance;

}

2. 依赖注⼊

依赖注⼊又称之为"控制反转",如果是熟悉javaweb开发的spring框架应该有⽐较深的

感触,在这⾥也不往深的讲,就简单讲解⼀下PhalApi中DI依赖注⼊的实现,以便让⼤家

了解这种设计模式实现原理以及⾃此基础上实现的惰性加载机制.

2.1 DI依赖注⼊实现

⼤家在PhalApi中常⽤的DI()⽅法,也就是采⽤我们上⾯所谓的单例模式,我们每次使⽤

DI()就是在使⽤PhalApi_DI类,其实我们依赖注⼊的关键也就是在PhalApi DI之中

先来讲⼀下他的⼀个实现⽅式再来讲具体实现,这⾥举个例⼦:

//配置

DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');

其实在内部有⼀个数组,它把config作为了key,把ne PhalApi_Config_File(API_ROOT

. '/Config')作为了value,然后保存了起来。当我们下⼀次使⽤DI->config->get()的时

候,它就会根据key值config拿出开始new好的类,所以可以说config操作是依赖于DI() ,

⽽且在使⽤DI()->config的时候永远都是在使⽤同⼀个实例,减少资源的消耗.

有的童鞋就好奇了为什么DI()->config会存到数组⾥⽽在需要的时候会拿出来?感兴趣

的童鞋可以百度⼀下魔法⽅法set和get

/**⼤家可以看到这是PhalApi_DI中的魔法⽅法__set

* 也就是当使⽤DI()->config = new PhalApi_Config_File(API_ROOT . '/

* 得的name值就是config, 得的value也就是new PhalApi_Config_File(AP

*/get同理,在内部实现都是调⽤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
C# 中的依赖注入(Dependency Injection,简称 DI)是一种设计模式,它可以让对象之间的依赖关系由容器在运行时动态地确定和注入。在 DI 中,需要注入的依赖通常以接口的形式定义,而容器会根据配置文件或者代码中的规则,自动创建依赖的实现并注入到需要它们的对象中。 在使用 DI 时,我们通常会将需要注入的依赖以服务(Service)的形式注册到容器中,然后在需要使用这些服务的对象中通过构造函数参数或者属性来接收它们。因为服务已经在容器中注册了,所以我们可以通过容器直接获取到服务的实例,而不需要自己手动创建。 例如,假设我们有一个名为 `MyService` 的服务接口和它的实现类 `MyServiceImpl`,我们可以将 `MyServiceImpl` 注册到 DI 容器中: ```csharp services.AddScoped<MyService, MyServiceImpl>(); ``` 然后在需要使用 `MyService` 的类中,我们可以通过构造函数来接收它: ```csharp public class MyClass { private readonly MyService _service; public MyClass(MyService service) { _service = service; } // ... } ``` 在这个例子中,我们通过 DI 将 `MyServiceImpl` 注入到 `MyClass` 中,而不需要直接创建 `MyServiceImpl` 的实例。在 `MyClass` 的构造函数中,我们将 `MyService` 作为参数传入,DI 容器会自动将 `MyServiceImpl` 的实例注入进去。 因为 `MyServiceImpl` 已经在 DI 容器中注册了,所以我们可以直接通过容器获取它的实例: ```csharp var service = serviceProvider.GetService<MyService>(); ``` 这样就可以获取到 `MyServiceImpl` 的实例了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值