019. Spring.Net简单入门之二:注入的两种方式

接上面的项目:

再创建两个类来继承IUserInfoDal接口

其中各个类的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spring.NetDemo
{
    class EFUserInfoDal : IUserInfoDal
    {
      public   string Name
        { get;set;}

      public  void Show()
        {
            Console.WriteLine("我是EFUserInfoDal"+Name);
        }
    }
}
----------------------------------------------------------------------------------------------------
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spring.NetDemo
{
    public interface IUserInfoDal
    {
        string Name
        {
            get; set;
        }
        void Show();
    }
}

------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spring.NetDemo
{
    public class NhUserInfo : IUserInfoDal
    {
        public NhUserInfo(string name)
        {
            this.Name = name;
        }
        public string Name
        {
            get;set;
        }

        public void Show()
        {
            Console.WriteLine("我是构造函数注入"+Name);
        }
    }
}

------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spring.NetDemo
{
    class UserInfoDal : IUserInfoDal
    {
        public string Name
        {
            get;
            set;
        }

        public void Show()
        {
            Console.WriteLine("第一次使用Spring.net入门!!!"+Name);
        }
    }
}

------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spring.NetDemo
{
    public class UserInfoService
    {
        public IUserInfoDal eFuUserInfoDal
        {
            get; set;
        }

        /// <summary>
        /// 注意如果外部不注入的话, 此处直接调用, 肯定是报错的
        /// </summary>
        public void show()
        {
            eFuUserInfoDal.Show();
            Console.WriteLine("我是UserInfoService");
        }
    }
}

 program中代码:

using Spring.Context;
using Spring.Context.Support;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spring.NetDemo
{
   public  class Program
    {
       public static void Main(string[] args)
        {
            //在没有使用Spring之前, 一直使用的传统的写法
            //IUserInfoDal userInfoDal = new UserInfo();
            //userInfoDal.Show();

            //下面使用容器来创建一个UserInfoDal实例

            IApplicationContext ctx = ContextRegistry.GetContext();

            //IUserInfoDal userInfoDal = ctx.GetObject("UserInfoDal") as IUserInfoDal;
            //userInfoDal.Show();


            //演示简单属性的依赖注入
            //IUserInfoDal efUserInfoDal = ctx.GetObject("EFUserInfoDal") as EFUserInfoDal;

            //efUserInfoDal.Show();


            //UserInfoService userInfoService = ctx.GetObject("UserInfoService") as UserInfoService;

            //userInfoService.show();

            IUserInfoDal iUserInfoDal = ctx.GetObject("NhUserInfo") as NhUserInfo;
            iUserInfoDal.Show();


            Console.ReadKey();

        }
    }
}

App.config文件配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
      <sectionGroup name="spring"> <!--这句话的意思就是在该配置文件中的<configuration>节点下, 添加一个节点, 节点的名字就是spring, 这个可以在下面看的到-->
        <!--而这个spring节点, 下面应该包含两个子节点, 第一个子节点的名字是context,其中context节点中的内容由Spring.Context.Support.ContextHandler来解析
        第二个子节点的名字是objects, 其中objects节点下的内容由Spring.Context.Support.DefaultSectionHandler解析-->
        <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
        <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
      </sectionGroup>
    </configSections>
 
    <spring>
      <!--spring.net对象容器的配置-->
      <context>
        <!--容器里面所有的对象在哪里配置?就是在这个uri所指定的路径中配置, 这里的意思就是在: 当前配置文件所在的目录中的spring节点下面的objects中配置着-->
   
        <resource uri="config://spring/objects"/>
        <!--<resource uri="file://Dals.xml" />-->
        <!--<resource uri="assembly://Spring.NetDemo/Spring.NetDemo/Dals.xml" />-->
      </context>
      
        
      <objects xmlns="http://www.springframework.net">
        <description>An example that demonstrates use of AutoProxy functionality.</description><!--这是一个描述, 无意义-->
<!--配置一个对象, name一般是一个类名, type分成两块, 第一部分: 类的全路径名称, 第二部分表示该类所在的程序集-->
        <object  name="UserInfoDal" type="Spring.NetDemo.UserInfoDal, Spring.NetDemo"/>
        <!--前台的所有配置都不用改变, 以后只需要改变一个配置, 注入的实例就会发生变化-->

      <!--演示从简单属性开始依赖注入-->
      <object  name="EFUserInfoDal" type="Spring.NetDemo.EFUserInfoDal, Spring.NetDemo">
        <property name="Name" value="我是EFDal,我是从App.config注入的" ></property>
      </object>
      
      <!--复杂属性的注入, 对象的注入-->
            <object  name="UserInfoService" type="Spring.NetDemo.UserInfoService, Spring.NetDemo">
            <property name="eFuUserInfoDal" ref="EFUserInfoDal" ></property> <!--注意复杂属性, 对象, 应该使用ref-->
              <!-- 这个value = UserInfoDal就是对应的了上面第一个配置, 注意这里的顺序是有影响的, 因为
              前面必须定义了UserInfoDal, 后面才能开始引用-->
            </object> 
      
       <!--演示构造函数注入-->
        <object  name="NhUserInfo" type="Spring.NetDemo.NhUserInfo, Spring.NetDemo">
            <constructor-arg index="0" value="%我是构造函数注入传递进来的%"></constructor-arg>
       </object>
      </objects>
    </spring>  
  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    
</configuration>

 

posted on 2017-02-27 13:31  印子  阅读(137)  评论(0)    收藏  举报

导航