Spring.Net简单用法

  Spring.Net其实就是抽象工厂,只不过更加灵活强大,性能上并没有明显的区别。

  它帮我们实现了控制反转。

  其有两种依赖注入方式。

    第一:属性注入

    第二:构造函数注入

  首先,我们去  Spring.net下载 您要的版本。 

  现在,我们创建一个控制台应用程序,并命名为 Spring.Net_Demo

  其次,我们在引入Spring.NET=>bin=>net=>4.0=>release文件夹下的Common.Logging.dll和Spring.Core.dll两个程序集。

  我们先来说最普通的通过其实现工厂中的实例。

  1:并在当前程序下,创建一个命名 IUserDAL 接口 ,并约束一个命名为 Show 的方法

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Spring.Net_Demo
 8 {
 9     public interface IUserDAL
10     {
11         
12         void Show();
13     }
14 }

  2:其次,我们在创建一命名 UserDAL 类,并实现接口 IUserDAL 中的Show 的方法

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Spring.Net_Demo
 8 {
 9     public class UserDAL : IUserDAL
10     {
11       
12         public void Show()
13         {
14             Console.WriteLine("我是UserDAL");
15         }
16     }
17 }

  3:接下来,重点就是配置,现在我们配置好App.config

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3     <!--Spring.Net中注释,不然报错-->
 4   
 5     <!-- <startup> 
 6         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
 7     </startup> -->
 8   
 9   <!--Spring.Net块配置-->
10      <configSections>
11         <sectionGroup name="spring">
12             <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
13             <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
14         </sectionGroup>
15     </configSections>
16     
17  <spring>
18 
19         <context>
20             <resource uri="config://spring/objects"/> 
21         </context>
22    
23         <objects  >
24           
25           <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集-->
26    <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo">
27     
28   </object>  
29           
30   
31         </objects>
32     </spring>
33 
34 </configuration>

    4:然后我们在Program.cs中调用一下

    //这里是初始化
   IApplicationContext context = ContextRegistry.GetContext();
   创建UserDAL实例 IUserDAL userDAL
= context.GetObject("UserDAL") as IUserDAL;
  //调用其方法 userDAL.Show(); Console.WriteLine(
"我是Spring.Net注入方法!");

       4:现在我们可以看到结果

  

 

-----------------------------------------------------------属性依赖注入(简单值)--------------------------------------------------------------------

  现在,我们来看看通过其属性依赖输入。

  首先,我们修改下UserDAL类,添加一个属性,并在Show方法中输出。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Spring.Net_Demo
 8 {
 9     public class UserDAL : IUserDAL
10     {
11         public string Name { get; set; }
12         public void Show()
13         {
14             Console.WriteLine("我是UserDAL"+Name); 
15         }
16     }
17 }

  其次,我们修改下App.config配置文件在object节点下,添加一个 <property name="Name" value="我是属性Name哦"></property>

  具体过程请仔细看代码。

<?xml version="1.0" encoding="utf-8" ?>
  <configuration>
     <!--Spring.Net中注释,不然报错-->
   
     <!-- <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      </startup> -->
    
    <!--Spring.Net块配置-->
      <configSections>
         <sectionGroup name="spring">
             <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
             <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
         </sectionGroup>
    </configSections>
     
 <spring>

         <context>
             <resource uri="config://spring/objects"/> 
        </context>
   
         <objects  >
           
           <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集-->
    <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo">
           <!--这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦”-->
                  <property name="Name" value="我是属性Name哦"></property>
    
  </object>  
           
  
         </objects>
     </spring>
 
 </configuration>            

  最后,在Program.cs调用不变,直接运行,结果如下:

  我们可以看到,其在App.config中就是给属性赋值操作了。

-----------------------------------------------------------属性依赖注入(复杂值)--------------------------------------------------------------------

  其属性注入,还可以注入更复杂的值。

  例如,我们在添加一个命名为:UserServer 的类。并添加一个UserDAL的属性,并添加方法Show中输出UserDAL中Name

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Spring.Net_Demo
 8 {
 9    public class UserServer
10     {
11         public UserDAL userDAL { set; get; }
12         public  void Show()
13         {
14             Console.WriteLine("我是UserServer"+userDAL.Name); 
15         }
16     }
17 }

  现在,我们该改造下App.config。详情请看代码。

<?xml version="1.0" encoding="utf-8" ?>
  <configuration>
     <!--Spring.Net中注释,不然报错-->
   
     <!-- <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      </startup> -->
    
    <!--Spring.Net块配置-->
      <configSections>
         <sectionGroup name="spring">
             <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
             <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
         </sectionGroup>
    </configSections>
     
 <spring>

         <context>
             <resource uri="config://spring/objects"/> 
        </context>
   
         <objects  >
           
           <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集-->
    <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo">
           <!--这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦”-->
                  <property name="Name" value="我是属性Name哦"></property>
    
  </object>  
           
        <!--这里我们在添加一个节点,属性注入复杂属性 -->
           <object name="UserServer" type="Spring.Net_Demo.UserServer,Spring.Net_Demo">
    <!--这里属性直接指向UserDAL节点,Name属性必须对应 -->
                 <property name="UserDAL" ref="UserDAL"></property> 
            </object>


  
         </objects>
     </spring>
 
 </configuration>         

   现在,我们还需修改下Program.cs代码,因为我们现在是注入UserServer

 

1  IApplicationContext context = ContextRegistry.GetContext();
2             //IUserDAL userDAL = context.GetObject("UserDAL") as IUserDAL; 
3         //现在是注入UserServer
4             UserServer userDAL = context.GetObject("UserServer") as UserServer;
5             userDAL.Show();
6             Console.WriteLine("我是Spring.Net注入方法!");        

我们可以看到,结果跟上面简单属性注入是一样。

-----------------------------------------------------------构造函数依赖注入--------------------------------------------------------------------

  构造函数注入,其实也差不多。首先,我们修改下UserDAL代码。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Spring.Net_Demo
 8 {
 9     public class UserDAL : IUserDAL
10     {
11         public string Name { get; set; }
12 
13         //这里添加一个构造函数
14         public UserDAL(string name)
15         {
16             Name = name;
17         }
18 
19         public void Show()
20         {
21             Console.WriteLine("我是UserDAL"+Name); 
22         }
23     }
24 }

 接下来,我们依然是要修改下App.config配置文件。

<?xml version="1.0" encoding="utf-8" ?>
  <configuration>
     <!--Spring.Net中注释,不然报错-->
   
     <!-- <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      </startup> -->
    
    <!--Spring.Net块配置-->
      <configSections>
         <sectionGroup name="spring">
             <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
             <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
         </sectionGroup>
    </configSections>
     
 <spring>

         <context>
             <resource uri="config://spring/objects"/> 
        </context>
   
         <objects  >
           <!--我们注释掉这一部分-->
<!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集 <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> 这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦 <property name="Name" value="我是属性Name哦"></property> </object> --> <!--这里为构造函数注入,两个选择一个就可,不在细说,有注释--> <object> <!--构造函数注入 Name不区分大小,对应构造参数名 --> <constructor-arg name="name" value="构造函数注入"></constructor-arg> <!-- 构造函数注入,需声明构造, 可直接用index=0 --> <!-- <constructor-arg index="0" value="构造函数注入"></constructor-arg> --> </object> <!--这里我们在添加一个节点,属性注入复杂属性 --> <object name="UserServer" type="Spring.Net_Demo.UserServer,Spring.Net_Demo"> <!--这里属性直接指向UserDAL节点,Name属性必须对应 --> <property name="UserDAL" ref="UserDAL"></property> </object> </objects> </spring> </configuration>

接下,调用代码无需改变,我们看下结果。

 -----------------------------------------------------------外部引入XML文件--------------------------------------------------------------------

    如果越来越多类,我们要注入,在配置文件里不会越来越多注入声明吗?

    我们可以独立把这些独立放在一个XML文件里,然后在配置文件里声明块就可以了。

     首先,我们新建一个Server.xml,在里面放入<objects>节点的所有代码。

    当然,您可以新建多个,比如在三层中,一个是DAL层,一个是BLL层等等,这里就不怎么一一展示了。

 

    (这里需注意下,因为我的是控制台应用程序,需右键这个XML文件,修改其属性《生成操作=> 嵌入的资源》)。

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <objects>
 3   
 4   <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo">
 5     
 6     
 7     <!--构造函数注入 可直接用index=0-->
 8     <constructor-arg index="0" value="外部引入哦"></constructor-arg>
 9   </object>
10   
11 </objects>

     然后修改下App.comfig ,详情请看代码

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!--Spring.Net中注释,不然报错-->
  
    <!-- <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup> -->
  
  <!--Spring.Net块配置-->
     <configSections>
        <sectionGroup name="spring">
            <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
            <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
        </sectionGroup>
    </configSections>
    
 <spring>
        <context>
            <resource uri="config://spring/objects"/>
          
            <!-- 外部XML文件引入,在控制台中,同时需把文件属性中的生成操作改成'嵌入资源'-->
           <resource uri="assembly://Spring.Net_Demo/Spring.Net_Demo/Server.xml"/>
        </context> 
    </spring>

</configuration>

    调用的话,不需要任何改变。

 

           本文结束。  

 

    以上两种注入方法,虽然有点啰嗦,勿介意哈,老鸟飘过哈。 

 

    

    

posted @ 2016-06-10 20:33  魏志夫  阅读(4997)  评论(4编辑  收藏  举报