Godot 学习笔记(3):IOC容器注入,以NlogServices为例

文章目录

  • 前言
  • 环境
  • 注意事项
  • Ioc注入
    • 文件夹设置
    • Service服务搭建
      • Nlog.config
      • NlogService配置
      • ButtonTest1Service控制反转
      • Program主入口
      • ButtonTest1从Ioc中获取服务
    • 输出
    • 生命周期问题
  • 总结

前言

Godot.Net中使用IOC之后,Godot的代码将会被极大的解耦。这里不不展开说明IOC的优点。

Godot Engine 4.2 简体中文文档 最佳实践 场景组织

.NET Core 依赖注入 Microsoft.Extensions.DependencyInjection

C# IOC 容器实战:KeyedService和生命周期

.NET 控制台NLog 使用

Godot 添加Nuget 引用

环境

  • visual studio 2022
  • .net core 8.0
  • godot 4.2.1
  • window 10

Nuget

在这里插入图片描述
在这里插入图片描述

注意事项

  • 我们每次visual Studio 写完代码后,一定要重新生产解决方案。不然会导致无法更新。
  • 我们可以在需要隐藏的文件夹中添加.gdignore,这样我们就能忽略多余的Csharp文件夹
  • 在绑定C# 脚本代码后,一定不能再次修改脚本代码的名字,不然会导致加载场景出现问题,整个场景彻底打不开。

Ioc注入

在这里插入图片描述
在这里插入图片描述

文件夹设置

在这里插入图片描述
这里建议手写,因为自动生成的代码是没有命名空间的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Service服务搭建

Nlog.config

详细的可以参考这个

.NET 控制台NLog 使用

我们在根路径下面添加Nlog.config
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <targets>
    <!--将Debug导出为每小时一个-->
    <target name="debug"
            xsi:type="File"
            fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/${date:format=dd}/${date:format=HH}.log"
            layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
    <!--将Error导出为每天一个,而且存放在一个Error文件夹中-->
    <target name="error"
            xsi:type="File"
            fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/Error/${date:format=dd}.log"
            layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
  </targets>


  <rules>
    <logger name="*"
            minlevel="Debug"
            writeTo="debug" />

    <logger name="*"
        minlevel="Error"
        writeTo="error" />
  </rules>
</nlog>

在这里插入图片描述
在这里插入图片描述

NlogService配置

public class NlogServices
{
    private Logger logger;

    public NlogServices()
    {
        var url = string.Format("{0}NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString());
        GD.Print($"url地址为{url}");
        LogManager.Configuration = new XmlLoggingConfiguration(url);
        
        logger = NLog.LogManager.GetCurrentClassLogger();
    }

    public void Debug(string msg)
    {
        GD.Print(msg);
        logger.Debug(msg);
    }

    public void Info(string msg)
    {
        GD.Print(msg);
        logger.Info(msg);

    }

    public void Error(string msg)
    {
        GD.Print(msg);

        logger.Error(msg);
    }

    public void Warning(string msg)
    {
        GD.Print(msg);
        logger.Warn(msg);
    }

}

ButtonTest1Service控制反转

我们应该在ButtonTest1Service中将ButtonTest1场景脚本对象获取。

    public class ButtonTest1Service
    {

        private NlogServices _nlogService;
        private ButtonTest1 _buttonTest1;
        public ButtonTest1Service(NlogServices nlogServices) {
            _nlogService = nlogServices;
            
        }

        public void Start(ButtonTest1 buttonTest1)
        {
            _buttonTest1 = buttonTest1;

            _buttonTest1.ButtonDown += () =>
            {
                _nlogService.Info("依赖注入成功!");
            };
        }
        
    }

Program主入口

我们应该有个主入口,我这里的主入口是Program.cs
在这里插入图片描述

    public static class Program
    {

        public static IServiceProvider Services  = ConfigureServices();
        /// <summary>
        /// Configures the services for the application.
        /// </summary>
        private static IServiceProvider ConfigureServices()
        {
            var services = new ServiceCollection();
            services.AddSingleton<NlogServices>();
            services.AddTransient<ButtonTest1Service>();

            return services.BuildServiceProvider();
        }

    }

ButtonTest1从Ioc中获取服务

public partial class ButtonTest1 : Button
{
	// Called when the node enters the scene tree for the first time.


	public ButtonTest1Service SenceSerivce { get; set; }
	public override void _Ready()
	{
		//获取Ioc容器
		SenceSerivce = Program.Services.GetService<ButtonTest1Service>();
		//Ioc控制反转,将本身添加到Start中
		SenceSerivce.Start(this);
    }

	// Called every frame. 'delta' is the elapsed time since the previous frame.
	public override void _Process(double delta)
	{
	}

}

输出

因为我们已经在Service里面注册了按钮事件,所以我们直接使用即可。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

生命周期问题

我更建议将Ioc注入放在构造函数而不是Ready里面,因为我们一般会在Ready里面去获取Node子节点。可能会有一个生命周期冲突的问题。

在这里插入图片描述

总结

Ioc容器会极大的解决Godot的代码的耦合问题。我们这次是添加了Nlog日志服务。我们后面还可以添加网络服务,数据库服务,文件加载服务等。这个极大的降低了我们代码的耦合。让我们更加专心的解决代码。

SencesScirpt和SenceSerivces的分开,也是功能和职责的分开。SencesScirpt更加注重Godot的生命周期,比如Ready(), Process等生命周期。SenceSerivces更加注重根本的代码逻辑。

我应该基本已经解决了大部分的代码问题。我后面应该就是开始认真的开发游戏了。目前打算从贪吃蛇,推箱子等经典游戏入手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/467755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果 一、简单介绍 二、素描画风格效果实现原理 三、案例简单实现步骤 一、简单介绍 Python是一种跨…

MYSQL日志 redo_log更新流程 bin_log以及bin_log数据恢复

Redo_log写入策略 Redo log的Innodb_flush_log_at_trx_commit:: 这个参数有三个取值 取值为0&#xff1a;每次事务提交时&#xff0c;只是把redo_log留在 redo log buffer中&#xff0c;宕机会丢失数据&#xff1b; 取值为1&#xff08;默认值&#xff09;&#xff1a;每次事…

Zookeeper(2)常用命令,ACL权限

文章目录 前言一、zk节点和节点类型节点类型 二、常用命令1.客户端连接2.常用命令help 帮助命令创建节点getsetdeletedeleteall pathstat查看节点的状态setquota增加配额listquota /frame 查看配额delquota删除配额 三、ACL权限控制&#xff1a;1、ZooKeeper权限特性&#xff1…

从单机到分布式微服务,大文件校验上传的通用解决方案

一、先说结论 本文将结合我的工作实战经历&#xff0c;总结和提炼一种从单体架构到分布式微服务都适用的一种文件上传和校验的通用解决方案&#xff0c;形成一个完整的方法论。本文主要解决手段包括多线程、设计模式、分而治之、MapReduce等&#xff0c;虽然文中使用的编程语言…

【开发】SpringBoot 整合 Redis

目录 前言 1. Redis 的下载及安装 1.1 Redis 的下载 1.2 安装 Redis 1.3 启动 Redis 2. 创建 SpringBoot 项目整合 Redis 2.1 环境要求 2.2 SpringBoot项目构建 2.2.1 方式一 2.2.2 方式二 2.3 在 pom.xml 文件中导入依赖坐标 2.4 在 application.properties 中加…

通过docker容器安装zabbix6.4.12图文详解(监控服务器docker容器)

一、相关环境及镜像 环境&#xff1a;ubuntu 22.04&#xff0c;zabbix-server6.4&#xff0c;mysql8.0 前提&#xff1a; 1&#xff09;先安装docker环境 2&#xff09;下载相关镜像 docker pull mysql:8.0 docker pull zabbix/zabbix-java-gateway:alpine-6.4-latest docker …

25考研|北大软微会「爆炸」吗?

软微不是已经爆炸了吗&#xff1f; 大家去看看他的录取平均分就知道了&#xff0c;没有实力千万别碰&#xff0c;现在考软微已经不存在捡漏之说。 110408的复试线已经划到了465分&#xff0c;这个人真的不低了&#xff0c;因为有数学一和408两个比较难的专业课&#xff0c;复…

从零开始学习在VUE3中使用canvas(三):font(字体)

一、简介 我们可以使用font在canvas中绘制文字&#xff0c;方式如下: const ctx canvas.getContext("2d"); // 绘制文字 ctx.font "24px 黑体, 宋体"; //字体大小 首选字体 备选字体 ctx.fillText("这里是显示的字的内容", 100, 50); //文字…

力扣106---从中序和后序序列构造二叉树

题目描述&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20…

Django HTML模版

一个网站的基本框架&#xff08;如页面布局、导航栏、页脚栏等&#xff09;往往是相同的。可以把这个基本框架做成一个模版&#xff0c;其它正式的HTML页面可以直接套用这个模版&#xff0c;可以大减少各HTML文件的代码量。 语法&#xff08;模版文件中&#xff09;&#xff1…

蓝桥杯练习题——健身大调查

在浏览器中预览 index.html 页面效果如下&#xff1a; 目标 完成 js/index.js 中的 formSubmit 函数&#xff0c;用户填写表单信息后&#xff0c;点击蓝色提交按钮&#xff0c;表单项隐藏&#xff0c;页面显示用户提交的表单信息&#xff08;在 id 为 result 的元素显示&#…

python统计分析——单样本分布形状和概率密度

参考资料&#xff1a;python统计分析【托马斯】 一、单样本分布的形状参数 在scipy.stats中&#xff0c;连续分布函数的特征是他们的位置和尺度。举两个例子&#xff1a;对于正态分布&#xff0c;&#xff08;位置/形状&#xff09;是由分布的&#xff08;均值/标准差&#xf…

计算地球圆盘负荷产生的位移

1.研究背景 计算受表面载荷影响的弹性体变形问题有着悠久的历史&#xff0c;涉及到许多著名的数学家和物理学家&#xff08;Boussinesq 1885&#xff1b;Lamb 1901&#xff1b;Love 1911&#xff0c;1929&#xff1b;Shida 1912&#xff1b;Terazawa 1916&#xff1b;Munk &…

B003-springcloud alibaba 服务治理 nacos discovery ribbon feign

目录 服务治理服务治理介绍什么是服务治理相关方案 nacos实战入门搭建nacos环境安装nacos启动nacos访问nacos 将商品微服务注册进nacos将订单微服务注册进nacos订单服务通过nacos调用商品服务 实现服务调用的负载均衡什么是负载均衡代码实现负载均衡增加一个服务提供者自定义实…

HTML5语义化元素

在HTML5之前&#xff0c;网站的分布层级有哪些呢&#xff1f; nav&#xff0c;header&#xff0c;main&#xff0c;footer 这样做有一个弊端 我们往往过多的使用div&#xff0c;通过ID或class来区分元素 对于浏览器来说这些元素不够语义化 对于我来说搜索引擎来说&#xff0c;不…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Line)

直线绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Line(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0c;该接…

深入理解mysql 从入门到精通

1. MySQL结构 由下图可得MySQL的体系构架划分为&#xff1a;1.网络接入层 2.服务层 3.存储引擎层 4.文件系统层 1.网络接入层 提供了应用程序接入MySQL服务的接口。客户端与服务端建立连接&#xff0c;客户端发送SQL到服务端&#xff0c;Java中通过JDBC来实现连接数据库。 …

AI基础知识(3)--神经网络,支持向量机,贝叶斯分类器

1.什么是误差逆传播算法&#xff08;error BackPropagation&#xff0c;简称BP&#xff09;&#xff1f; 是一种神经网络学习算法。BP是一个迭代学习算法&#xff0c;在迭代的每一轮使用广义的感知机学习规则对参数进行更新估计。基于梯度下降&#xff08;gradient descent&am…

2025张宇考研数学基础36讲,视频百度网盘+PDF

一、张宇老师全年高数体系&#xff08;听课用书指南&#xff09; 25张宇全程&#xff1a; docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴在浏览器上打开&#xff0c;就可以看到2025张宇的全部的啦&#xff01; 一般来说我们把考研数学划分为3-4个阶段&#xff0c;分别是基础阶…

第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第五篇&#xff1a;第五篇&#xff1a;数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南 --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准&#xff08;2&#xff09; ​​​​​​​翻译计划 第一篇序言第二篇简介和目录第三篇概述- IA…