基于unity框架构造IOC容器

一.写在前面

基于上一篇经过配置文件造成ioc容器的例子,咱们采用另一种方式去造成ioc容器,那就是unity框架。git

二.unity简介

Unity 应用程序块(Unity)是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入。程序员

1.控制反转 (IoC) 模式,这是一种设计模式,它描述了用于支持对象能够“查找”它们须要的其余对象的实例的插件架构的技术。编程

2.依赖注入 (DI) 模式,这是 Ioc 模式的一种特殊状况,是一种基于改变对象的行为而不改变类的内部的接口编程技术。开发人员编写实现接口的类代码,并基于接口或者对象类型使用容器注入依赖的对象实例到类中。用于注入对象实例的技术是接口注入、构造函数注入、属性(设置器)注入和方法调用注入。设计模式

 

三.为何要实现DI(依赖注入)

为了灵活的在外部就拿到了实现后的接口,经过unity能够有不少方式去实现这样的要求。架构

下面分常见的两种方式(构造函数注入和属性注入依赖)。框架

说明:为何要注入依赖?由于之前的拿到接口的地方是在调用者(类)的内部实现接口的。好比一个类A须要用的接口B,那常常咱们会这样,在A的内部的某个方法下须要使用到接口B,那咱们就在这个方法里面去实现这个接口,而后调用这个接口。那么这个类A与接口B的依赖关系就放在了类A的里面。这样并不算的上一种好的设计,假若类A中调用的接口实现变更了,那咱们不得不进入类A里面进行调整,为了防止这样的状况发生,依赖注入的设计方式产生了,它将接口的实现转移到了外部,有效的防止了若是后期接口的实现变了,咱们只须要在外部那接口的地方换一下便可,不用操心类A里面。接下来咱们看看具体例子函数

四.unity框架的引用

在须要引用unity框架的项目上,添加引用,选择管理NeGet程序包,搜索unity,下载安装便可。如图:编码

若是找不到,楼主提供下载unity包 密码:rp2qspa

下载完后引用便可.net

五.经过unity构造ioc容器

咱们改掉调用类原先内部实现接口而后调用的方式,接口的实如今外部拿到,或经过构造函数或属性注入进去便可。

1.构造函数注入接口

namespace Unity_IocDemo
{
    public class Operater
    {
        private ICooker COOKER;
      
        public Operater(ICooker cooker)//构造函数将接口传入进来
        {
            COOKER = cooker;
       
        }
        public void cook() {
            COOKER.Cook();
        }
    }
}

构造本身的ioc_factory

namespace LogicLayer
{
    public class IOC_Factory
    {

        public  IUnityContainer container { get; set; }
        public IOC_Factory()
        {
            container = new UnityContainer();//容器
        }

        /// <summary>
        /// 依赖注入
        /// </summary>
        /// <typeparam name="Toperater">须要调用接口的调用类</typeparam>
        /// <returns></returns>
        public  Toperater GetOperater<Toperater>()
        {
            Toperater operater = container.Resolve<Toperater>();//DI(依赖注入)
            return operater;
        }



        /// <summary>
        /// 注册接口容器
        /// </summary>
        /// <typeparam name="Tinterface">接口</typeparam>
        /// <typeparam name="Tclass">实现Tinterface接口的具体类</typeparam>
        public  void register<Tinterface,Tclass>() where  Tclass:Tinterface
        {
            container.RegisterType<Tinterface, Tclass>();//注册接口与具象依赖
        }

      

    }
}

当咱们使用Operater类时,就能够利用ioc_factory工厂拿到它的实例了。这个过程是经过unity框架自动绑定的。以下:

namespace Unity_IocDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            IOC_Factory ioc = new IOC_Factory();//ioc容器
            ioc.register<ICooker, potatoHelper>();//注册依赖关系
            Operater operater1 = ioc.GetOperater<Operater>();//注入依赖关系
            operater1.cook();
            Console.Read();
        }
    }
}

分析:我的感受这样作,有什么鸟用?说实话,尚未采用配置文件造成ioc拿接口好。若是说注册依赖关系的时候仍是会出现具体类的类名,那这个耦合并无真正意义上被解除。至少program类与ICooker依赖了,且与potatohelper也耦合了。惟一的方便就是自动将接口实现后注入到了operater类中。这种方式有待后续考察

2.采用属性方式注入

那就须要在调用类中设置接口属性,并加上Dependency属性注解,这样unity框架会自动将接口注入到该属性下,调用类代码以下:

namespace Unity_IocDemo
{
    public class Operater
    {
        [Dependency]//须要被注入的属性标记
        public IPerson person { get; set; }
        private ICooker COOKER;
        public Operater(ICooker cooker)//构造函数将接口传入进来
        {
            COOKER = cooker;
       
        }


        public void cook() {
            COOKER.Cook();
        }
    }
}

依赖注入代码以下:

namespace Unity_IocDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            IOC_Factory ioc = new IOC_Factory();//ioc容器
            ioc.register<ICooker, potatoHelper>();//注册依赖关系
            ioc.register<IPerson, perosin>();
            Operater operater1 = ioc.GetOperater<Operater>();//注入依赖关系
            operater1.person.eat();
            operater1.cook();
            Console.Read();
        }
    }
}

用法是构造函数同样,只须要注册依赖关系就能够了。

运行结果以下:

我的以为用属性注入应该是要比构造函数注入要合适,至少不会形成构造函数的参数过多过长,尽管一个调用类不可能同时使用到不少借口,通常都是一到三个接口。

六.总结

今天采用unity自动从外界将实现的接口注入到了调用类中,可是这种外界注入的过程也涉及到了具体类的类名,这也算是只用耦合了。可是相比使用配置文件造成ioc容器利用反射来拿接口的方式,又减小了在配置文件上的配置。由于若是具体类过多,配置信息无疑会边的很长。楼主也怀疑这样所有卸载配置文件里是否稳当。而采用unity自动注入,虽然解决了将具体类写入配置的麻烦,却也在注册接口与具体类依赖关系上,耦合了。总之各有各的不足,有点都是同样。在用的过程当中好好体会吧。

七.关于

一个不甘于天天只编码,企图摆脱思想上的麻痹的程序员。qq:739462304.任何其余领域的事情,我都有情趣了解。

八. 项目demo

点我下载

相关文章
相关标签/搜索