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>
浙公网安备 33010602011771号