通过例子学Ioc(1)

一、什么是IOC
IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。

二、Ioc的优点
        我们知道,在Java基本教程中有一个定律告诉我们:所有的对象都必须创建;或者说:使用对象之前必须创建,但是现在我们可以不必一定遵循这个定律了,我们可以从Ioc容器中直接获得一个对象然后直接使用,无需事先创建它们。
  这种变革,就如同我们无需考虑对象销毁一样;因为Java的垃圾回收机制帮助我们实现了对象销毁;现在又无需考虑对象创建,对象的创建和销毁都无需考虑了,这给编程带来的影响是巨大的。

 以上内容都是从网上抄来的,只为对IOC有个初步的印象,接下来准备自己写代码来验证IOC的优点。
### C# 中的 IOC 概念及其实现 #### 什么是 IOC? 控制反转(Inversion of Control, IoC)是一种设计原则,用于减少代码之间的耦合度。通过将对象创建和管理的责任交给外部容器,而不是由类本身负责实例化其依赖项,从而实现了松散耦合的设计模式[^2]。 #### DIP 和 IOC 的关系 依赖倒置原则(Dependency Inversion Principle, DIP)是面向对象编程中的一个重要原则,它强调高层模块不应该依赖于低层模块,两者都应该依赖抽象;而具体类应该依赖接口或抽象基类。IoC 是实现 DIP 的一种方式之一。 --- #### 使用自定义简单 IOC 容器 下面是一个简单的 IOC 容器实现示例: ```csharp using System; using System.Collections.Generic; public interface IService { void Execute(); } public class Service : IService { public void Execute() { Console.WriteLine("服务已执行"); } } public class SimpleIocContainer { private readonly Dictionary<Type, Func<object>> _registrations = new(); public void Register<TInterface, TImplementation>() where TImplementation : TInterface { _registrations[typeof(TInterface)] = () => Activator.CreateInstance(typeof(TImplementation)); } public T Resolve<T>() { if (_registrations.TryGetValue(typeof(T), out var factory)) return (T)factory.Invoke(); throw new InvalidOperationException($"未注册类型 {typeof(T).Name}"); } } class Program { static void Main(string[] args) { var container = new SimpleIocContainer(); container.Register<IService, Service>(); var service = container.Resolve<IService>(); service.Execute(); Console.ReadLine(); } } ``` 上述代码展示了如何构建一个基本的 IOC 容器,并通过 `Register` 方法注册组件和服务,再通过 `Resolve` 方法解析所需的实例。 --- #### 使用内置的 Microsoft.Extensions.DependencyInjection .NET 提供了一个轻量级的依赖注入框架——Microsoft.Extensions.DependencyInjection。以下是使用该库的一个例子1. 需要安装 NuGet 包: - **Microsoft.Extensions.DependencyInjection** - **Microsoft.Extensions.DependencyInjection.Abstractions** 2. 示例代码如下: ```csharp using Microsoft.Extensions.DependencyInjection; using System; public interface IMyService { void DoWork(); } public class MyService : IMyService { public void DoWork() { Console.WriteLine("工作已完成!"); } } class Program { static void Main(string[] args) { // 创建服务集合并配置依赖注入 var services = new ServiceCollection(); services.AddTransient<IMyService, MyService>(); // 添加瞬态生命周期的服务 // 构建提供者 var serviceProvider = services.BuildServiceProvider(); // 解析服务 var myService = serviceProvider.GetService<IMyService>(); myService.DoWork(); Console.ReadLine(); } } ``` 在这个例子中,我们利用了 .NET 自带的 DI 容器来管理和解析依赖项。需要注意的是,不同的生命周期选项会影响性能以及资源分配的方式[^3]。 --- #### 生命周期管理 在使用内置的 DI 容器时,可以指定三种主要的生命周期策略: - **Transient**: 每次请求都会创建一个新的实例。 - **Scoped**: 在同一个作用域内共享单个实例(通常对应 HTTP 请求范围内的 ASP.NET Core 应用程序)。 - **Singleton**: 整个应用程序运行期间只存在一个全局唯一的实例。 --- #### 总结 IOC 是现代软件开发的重要组成部分,能够显著提高系统的可维护性和扩展性。无论是手动编写简易版 IOC 容器还是借助成熟的第三方工具如 Autofac 或 Unity,都可以有效实践这一理念。对于初者来说,掌握基础理论并通过实际项目应用这些技术至关重要。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值