构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前会自定义创建相应参数对象;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.创建一个UnityContainer对象
            //2.通过UnityContainer对象的RegisterType方法来注册对象与对象之间的关系
            //3.通过UnityContainer对象的Resolve方法来获取指定对象关联的对象
            UnityContainer container = new UnityContainer();//创建容器
            container.RegisterType<IWaterTool, PressWater>();//注册依赖对象 默认注册(无命名),如果后面还有默认注册会覆盖前面的
            container.RegisterType<IWaterTool, PressWater>("PressWater1");  //命名注册
            IWaterTool water = container.Resolve<IWaterTool>();
            IWaterTool water1 = container.Resolve<IWaterTool>("PressWater1");
            Console.WriteLine(water.returnWater());
            Console.WriteLine(water1.returnWater());   
            Console.Read();
        }
    }

    /// <summary>
    /// 压水井
    /// </summary>
    public class PressWater : IWaterTool
    {
        public string returnWater()
        {
            return "地下水好甜啊!!!";
        }
    }

    /// <summary>
    /// 获取水方式接口
    /// </summary>
    public interface IWaterTool
    {
        string returnWater();
    }
}

 

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.在配置文件<configSections> 配置节下注册名为unity的section
            //2.在<configuration> 配置节下添加Unity配置信息
            //3.在代码中读取配置信息,并将配置载入到UnityContainer中
            IUnityContainer container = new UnityContainer();
            container.LoadConfiguration("MyContainer");
            UnityConfigurationSection section
              = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");//获取指定名称的配置节   
            section.Configure(container, "MyContainer");//获取特定配置节下已命名的配置节<container name='MyContainer'>下的配置信息

            IWaterTool water = container.Resolve<IWaterTool>("PressWater");
            Console.WriteLine(water.returnWater());
            Console.Read();
        }
    }

    /// <summary>
    /// 压水井
    /// </summary>
    public class PressWater : IWaterTool
    {
        public string returnWater()
        {
            return "地下水好甜啊!!!";
        }
    }

    /// <summary>
    /// 获取水方式接口
    /// </summary>
    public interface IWaterTool
    {
        string returnWater();
    }
}

 

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
  </configSections>

  <unity>
    <!--定义类型别名-->
    <aliases>
      <add alias="IWaterTool" type="ConsoleApplication1.IWaterTool,ConsoleApplication1" />
      <add alias="PressWater" type="ConsoleApplication1.PressWater,ConsoleApplication1" />
    </aliases>
    <!--容器-->
    <container name="MyContainer">
      <!--映射关系-->
      <register type="IWaterTool"  mapTo="PressWater" name="PressWater"></register>
    </container>
  </unity>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  </startup>
</configuration>

 


属性注入(Property Injection):如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,IoC容器会自动初始化该属性;

    class Program
    {
        static void Main(string[] args)
        {
            UnityContainer container = new UnityContainer();
            container.RegisterType<IPeople, VillagePeople>();
            container.RegisterType<IWaterTool, PressWater>();
            IPeople people = container.Resolve<IPeople>();
            Console.WriteLine(people._pw.returnWater());
            people.DrinkWater();
            Console.Read();
        }
    }

    /// <summary>
    /// 压水井
    /// </summary>
    public class PressWater : IWaterTool
    {
        public string returnWater()
        {
            return "地下水好甜啊!!!";
        }
    }

    /// <summary>
    /// 获取水方式接口
    /// </summary>
    public interface IWaterTool
    {
        string returnWater();
    }

    /// <summary>
    /// 人接口
    /// </summary>
    public interface IPeople
    {
        IWaterTool _pw { get; set; }
        void DrinkWater();
    }

    /// <summary>
    /// 村民
    /// </summary>
    public class VillagePeople : IPeople
    {
        [Dependency]
        public IWaterTool _pw { get; set; }
        public VillagePeople(IWaterTool pw)
        {
            _pw = pw;
        }
        public void DrinkWater()
        {
            Console.WriteLine(_pw.returnWater());
        }
    }

 

方法注入(Method Injection):如果被依赖对象需要调用某个方法进行相应的初始化,在该对象创建之后,IoC容器会自动调用该方法。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            UnityContainer container = new UnityContainer();
            container.RegisterType<IPeople, VillagePeople>();
            container.RegisterType<IWaterTool, PressWater>();
            IPeople people = container.Resolve<IPeople>();
            Console.WriteLine(people._pw.returnWater());
            people.DrinkWater();
            Console.Read();
        }
    }

    /// <summary>
    /// 压水井
    /// </summary>
    public class PressWater : IWaterTool
    {
        public string returnWater()
        {
            return "地下水好甜啊!!!";
        }
    }

    /// <summary>
    /// 获取水方式接口
    /// </summary>
    public interface IWaterTool
    {
        string returnWater();
    }

    /// <summary>
    /// 人接口
    /// </summary>
    public interface IPeople
    {
        IWaterTool _pw { get; set; }
        void DrinkWater();
        void ObjectInit();
    }

    /// <summary>
    /// 村民
    /// </summary>
    public class VillagePeople : IPeople
    {
        [Dependency]
        public IWaterTool _pw { get; set; }
        public VillagePeople(IWaterTool pw)
        {
            _pw = pw;
        }
        public void DrinkWater()
        {
            Console.WriteLine(_pw.returnWater());
        }
        [InjectionMethod]
        public void ObjectInit()
        {
            Console.WriteLine("方法注入");
        }
    }
}

 

相关文章: