原文:https://blog.csdn.net/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(); } }
日志类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//日志接口 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"); } }
调用方法
//这种写法 一个不好地方。有很多类需要依赖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(); }