当前位置: 首页 > news >正文

Unity——VContainer的依赖注入

一、IOC控制反转和DI依赖倒置

1、IOC框架核心原理是依赖倒置原则

C#设计模式的六大原则

使用这种思想方式,可以让我们无需关心对象的生成方式,只需要告诉容器我需要的对象即可,而告诉容器我需要对象的方式就叫做DI(依赖注入)

 今天主要想研究一下DI(依赖注入),这里我选了VContainer

地址:https://github.com/hadashiA/VContainer

文档地址:https://vcontainer.hadashikick.jp/

 二、VContainer介绍

 由于我们使用的是Unity,而主要的Mono不支持构造函数。所以我们这里选择注入方式主要是特性注入和方法注入

  三、VContainer案例

(1)简单方法注入:

1、注册类型

public class GameLifetimeScope : LifetimeScope
{protected override void Configure(IContainerBuilder builder){builder.RegisterEntryPoint<ActorPresenter>();}
}

2、方法注入

这里实现接口 IStartableITickable。它是不依赖于Mono的接口,因此性能上更好,另一方面,IStartable与Mono的Start,ITickable与Mono的Update都是相同的。

public class ActorPresenter : IStartable,ITickable
{public void Start(){Debug.Log("Start ActorPresenter");}public void Tick(){Debug.Log("Update ActorPresenter");}
}

(2)基础MVC功能:

Model层

public class UIModel
{public void Hello() {Debug.Log("Hello World");}
}

View层

public class UIView : MonoBehaviour
{public Button button;
}

 Control层

public class UIControl : IStartable
{readonly UIModel _model;readonly UIView _view;public UIControl(UIModel model){this._model = model;}public UIControl(UIModel model, UIView view){this._model = model;this._view = view;}public void Start(){_view.button.onClick.AddListener(() => _model.Hello());}
}

通过这样做,我们成功地分离了领域控制/控制流/显示组件

在VContainter中,记得注册

public class GameLifetimeScope : LifetimeScope
{public UIView helloScreen;protected override void Configure(IContainerBuilder builder){builder.RegisterEntryPoint<UIControl>();builder.Register<UIModel>(Lifetime.Singleton);builder.RegisterComponent(helloScreen);}
}

(3)构造注入

        构造函数里,只需要写一个需要依赖注入的函数,成员变量里就可以随时获得对象。如下例子ClassB构造函数的参数是ClassA,我们的classA变量就可以随时使用

class ClassB : IStartable,ITickable
{readonly ClassA a;public ClassB(ClassA a){Debug.Log("ClassA构造函数注入");this.a = a;}public void Start(){a.Start();}public void Tick(){a.Update();}
}
class ClassA
{public ClassA(){Debug.Log("ClassA构造");}public void Start(){Debug.Log("Start");}public void Update() {Debug.Log("Update");}
}
public class GameLifetimeScope : LifetimeScope
{//public UIView helloScreen;protected override void Configure(IContainerBuilder builder){builder.RegisterEntryPoint<ClassB>();builder.Register<ClassA>(Lifetime.Singleton);}
}
(4)方法注入(其他的和上边一样)
class ClassB : IStartable,ITickable
{private ClassA a;[Inject]public void GetClassA(ClassA a) {Debug.Log("方法注入");this.a = a;}public void Start(){a.Start();}public void Tick(){a.Update();}
}
(5)字段/属性注入
class ClassB : IStartable,ITickable
{[Inject]private ClassA a;public void Start(){a.Start();}public void Tick(){a.Update();}
}

相关文章:

  • PLECS如何下载第三方库并导入MOSFET 的xml文件,xml库路径添加方法及相关问题
  • amancevice/superset
  • cssip 第11章 : 安全网络架构和保护网络组件
  • 科技创新领航 ,安川运动控制器为工业自动化赋能助力
  • 论文阅读:TinyGPT-V 论文阅读及源码梳理对应
  • 独孤思维:​没时间做副业,怎么办?
  • Apache OFBiz groovy 远程代码执行漏洞(CVE-2023-51467)复现
  • 在windows11系统上利用docker搭建linux记录
  • C++内存分配策略
  • 《微信小程序开发从入门到实战》学习七十九
  • Leaflet + Vue使用案例
  • (学习日记)2024.01.09
  • pyspark 使用udf 进行预测,发现只起了一个计算节点
  • 半监督学习 - 自训练(Self-training)
  • java进阶-java与http
  • Js基础——数据类型之Null和Undefined
  • Objective-C 中关联引用的概念
  • Spring Cloud中负载均衡器概览
  • VuePress 静态网站生成
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 大主子表关联的性能优化方法
  • 聊聊directory traversal attack
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 通过npm或yarn自动生成vue组件
  • 再谈express与koa的对比
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • - 转 Ext2.0 form使用实例
  • ionic异常记录
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 数据可视化之下发图实践
  • ​低代码平台的核心价值与优势
  • # .NET Framework中使用命名管道进行进程间通信
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • $.ajax,axios,fetch三种ajax请求的区别
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (39)STM32——FLASH闪存
  • (4)logging(日志模块)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (七)c52学习之旅-中断
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (算法二)滑动窗口
  • (一)WLAN定义和基本架构转
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET 5种线程安全集合
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 调用php,php 调用.net com组件 --
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET面试题(二)
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @Autowired多个相同类型bean装配问题