看了不少IOC的文章。简单概念梳理下。
1.依赖,依赖倒置,控制反转(IOC),依赖注入
解释是仿照的例子。
依赖:类和类之间的联系。例如播放器类依赖媒体文件类
依赖倒置:本来是A类依赖B类。现在创建IB接口类。让A和B不再互相依赖,A类只知道自己需要调用IB接口的类。例如实现媒体文件接口类。好处在于下次再有新的媒体文件, 播放器类不用重构。
控制反转:本来A类要调用B类就需要创建B类实例,A类要调用C类就需要创建C类实例,而现在具体是调用哪个实例是由配置控制。例如:创建媒体文件类的工作不再由播放器类来完成。Main方法配置去控制是MP3文件还是默认文件。
依赖注入:当创建调用者的时候,IOC容器会向调用注入被调用的实例,因此也称为依赖注入。例如IOC的构造函数注入
下面贴下代码:方便以后回忆的时候看。
class Program { static void Main(string[] args) { UnityContainer container = new UnityContainer(); container.RegisterType(); container.RegisterType (); container.RegisterType (); container.RegisterType (); var op1 = container.Resolve (); op1.Do(); //以前的调用方法 //var op2 = new Operation(new 网易云Player(),new MP3MediaFile()); //op2.Do(); Console.ReadKey(); } }
public class Operation { IMediaFile _mtype; IPlayer _player; public Operation(IPlayer player, IMediaFile mtype) { _player = player; _mtype = mtype; } public void Do() { _player.play(_mtype); } }
public interface IPlayer { void play(IMediaFile file); } public class DefalutPlayer: IPlayer { public void play(IMediaFile file) { Console.Write("默认:"+file.Name); } } public class WYYPlayer : IPlayer { public void play(IMediaFile file) { Console.Write("网易云:" + file.Name); } } public interface IMediaFile { string Name { get; set; } } public class DefaultMediaFile: IMediaFile { public string Name { get; set; } = "默认文件"; } public class MP3MediaFile : IMediaFile { public string Name { get; set; } = "MP3文件"; }
后续:UNITY 容器注入什么就拿到什么。想做到插件式开发。还需要定制注入的规则。
说个插件式开发流程:比如有A实现,B实现。我想要真正来做的是B的方法。
1.反射A,B拿到AB的type。
2.在RegisterType的时候根据具体情况注入哪个。比如数组排序,比如type优先级等