Unity IOC简单认知

时间:2023-03-08 21:44:15
Unity IOC简单认知

看了不少IOC的文章。简单概念梳理下。


1.依赖,依赖倒置,控制反转(IOC),依赖注入

解释是仿照http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html的例子。

依赖:类和类之间的联系。例如播放器类依赖媒体文件类

依赖倒置:本来是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<IPlayer, WYYPlayer>();
container.RegisterType<IPlayer, DefalutPlayer>();
container.RegisterType<IMediaFile, MP3MediaFile>();
container.RegisterType<IMediaFile, DefaultMediaFile>(); var op1 = container.Resolve<Operation>();
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优先级等