C# 对IOC的理解 依赖的转移

本文探讨了日志系统在软件开发中的依赖管理,从直接依赖具体日志类到依赖抽象接口的进化过程。通过引入依赖注入(DI)和IOC容器,实现了日志类的灵活替换,增强了系统的可维护性和扩展性。

原文:https://blog.youkuaiyun.com/huwei2003/article/details/40022011

系统 可方便的替换 日志类

 

自己的理解:
  依赖接口,日志的实例化 不直接写在依赖类中,而是放在构造函数的参数中。目的:谁调用谁实现。然后再借助ioc自动实例化注入到构造函数中

 

依赖的进化

    //1、直接依赖Log类
    //   系统更换Log类比较麻烦,因为每个类都依赖具体的实现类
    public class ProductService1
    {
        private Log _log;

        public ProductService1()
        {
            _log = new Log();
        }

        public void SayHello()
        {
            _log.Write();
        }
    }

    //2、依赖接口ILog
    //   方法的调用依赖接口ILog。以前是依赖具体实现类Log,换成依赖接口类ILog,这样在构造函数中可以更换其它的实现类
    //   在构造函数中 强依赖 ILog的具体实现
    public class ProductService2
    {
        private ILog _log;

        public ProductService2()
        {
            _log = new Log();
        }

        public void SayHello()
        {
            _log.Write();
        }
    }

    //3、强依赖的地方 变成了 谁调用谁实现
    //   这样就可以 不再类ProductService3的内部 具体实现ILog,把实现的地方,转移到类的外部
    public class ProductService3
    {
        private ILog _log;

        public ProductService3(ILog _log)
        {
            this._log = _log;
        }

        public void SayHello()
        {
            _log.Write();
        }
    }

 

日志类

    //日志接口
    public interface ILog
    {
        void Write();
    }
    //日志类1 实现 日志接口
    public class Log : ILog
    {
        public void Write()
        {
            Console.Write("Log");
        }
    }
    //日志类2 实现 日志接口
    public class TxtLog : ILog
    {
        void ILog.Write()
        {
            Console.Write("TxtLog");
        }
    }
    //日志类3 实现 日志接口
    public class DbLog : ILog
    {
        void ILog.Write()
        {
            Console.Write("DbLog");
        }
    }
View Code

 

调用方法

        //这种写法 一个不好地方。有很多类需要依赖ILog,就在很多个地方依赖
        public void test4()
        {
            ILog log = new Log();
            var productService = new ProductService3(log);
            productService.SayHello();
        }


        //依赖由ioc框架自动管理
        public void test5()
        {
            ContainerBuilder builder = new ContainerBuilder();

            //替换系统的日志类
            //builder.RegisterType<Log>().As<ILog>();
            //builder.RegisterType<TxtLog>().As<ILog>();
            builder.RegisterType<DbLog>().As<ILog>();

            builder.RegisterType<ProductService3>();
            IContainer container = builder.Build();
            var productService = container.Resolve<ProductService3>();
            productService.SayHello();
        }

 

转载于:https://www.cnblogs.com/guxingy/p/10855160.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值