c#反射与依赖注入

反射是.net框架的功能,不只是c#语言的功能。

依赖反转是一个概念,但是依赖注入是在概念基础之上结合接口和反射机制所形成的应用。

依赖注入最重要的是有一个container容器,各种各样的类型和对应的接口都放到容器里面,在.NET Freamwork中,有一个第三方容器Unity, 但是在.NET Core里面,是IServiceCollection。

下面是简单依赖注入的方法

复制代码
namespace TestClass
{
    class Program
    {
        static void Main(string[] args)
        {
            //var driver = new Driver(new LightTank());
            //driver.Run();
            #region  这是可以在程序启动的时候注册的方式
            //创建容器对象
            var sc = new ServiceCollection();
            //往容器中装数据接口是IItank,实现这个接口的是LightTank, 
            sc.AddScoped(typeof(IItank), typeof(LightTank));
            sc.AddScoped(typeof(IVehicle),typeof(Car));
            sc.AddScoped<Driver>() ;
            var sp = sc.BuildServiceProvider();
            #endregion

            #region  这是在程序其他地方只要能获取到sp对象的地方就能用
            IItank itank = sp.GetService<IItank>();
            //因为在注册的时候实现的是LightTank,所以下列的方法全是执行这个类的方法
            itank.Fire();
            itank.Run();

            //因为注册的交通工具是Car,所以这里调用的就是Car类的方法
            var driver = sp.GetService<Driver>();
            driver.Run(); 
            #endregion 
            Console.ReadKey();

        }
    }
    interface IVehicle
    {
        void Run();
    }
    /// <summary>
    /// 汽车
    /// </summary>
    class Car : IVehicle
    {
        public void Run()
        {
            Console.WriteLine("Car is running");
        }
    }
    /// <summary>
    /// 卡车
    /// </summary>
    class Truck : IVehicle
    {
        public void Run()
        {
            Console.WriteLine("Truck is running");
        }
    }
    /// <summary>
    /// 坦克
    ///  c#中类或者接口可以继承多接口,但是不能继承多基类。
    ///  
    /// </summary>
    interface IItank : IVehicle, IWeapon
    {

    }
    class LightTank : IItank
    {
        public void Fire()
        {
            Console.WriteLine("LightTank is firing");
        }

        public void Run()
        {
            Console.WriteLine("LightTank is running");
        }
    }
    class HeavyTank : IItank
    {
        public void Fire()
        {
            Console.WriteLine("HeavyTank is firing");
        }

        public void Run()
        {
            Console.WriteLine("HeavyTank is running");
        }
    }
    /// <summary>
    /// 驾驶员类
    /// </summary>
    class Driver
    {
        private IVehicle vehicle;
        public Driver(IVehicle vehicle)
        {
            this.vehicle = vehicle;
        }
        public void Run()
        {
            vehicle.Run();

        }

    }
    interface IWeapon
    {
        void Fire();

    }

}
复制代码

 

posted @   安静点--  阅读(1238)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示