IoC(Inversion of Control)翻译为控制反转,在之前我们实例化一个对象是要依赖这个对象的类的,而IoC的作用是让对象依赖类变成利用IoC容器统一管理这些对象。从而是类和对象之间耦合度降低。
实例化一个对象,有三种方式:面向接口实例化,利用抽象工厂+反射,还有今天说的利用IoC。
先看下面的代码:一个接口,还有它的实现
namespace Demo
{
public interface IUserInfo
{
void Show();
}
namespace Demo
{
public class UserInfo : IUserInfo
{
public void Show()
{
Console.WriteLine("hello");
}
}
}
namespace Demo
{
class Program
{
private static void Main(string[] args)
{
IUserInfo userInfo=new UserInfo();
userInfo.Show();
}
}
}
2.利用抽象工厂+反射,可以不必知道具体的实现,利用工厂就可以创建出实例,这样接口和实例化对象就达到了松耦合。
namespace Demo
{
/// <summary>
/// 抽象工厂+反射
/// </summary>
public static class DALFactory
{
public static IUserInfo GetusUserInfo()
{
string classFullName = "Demo.UserInfo";
var obj = Assembly.Load("Demo").CreateInstance(classFullName, true);</span>
return obj as IUserInfo;
}
}
}
//控制台代码
namespace Demo
{
class Program
{
private static void Main(string[] args)
{
IUserInfo userInfo = DALFactory.GetusUserInfo();
userInfo.Show();
}
}
}
先是写配置文件。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<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>
<!--spring容器上下文,统一入口,创建的对象在config://spring/objects这个位置-->
<context>
<resource uri="config://spring/objects"/>
</context>
<!--容器中所有的对象-->
<objects xmlns="http://www.springframework.net">
<object name="UserInfo" type="Demo.UserInfoEFDal, Demo">
</object>
</objects>
</spring>
</configuration>
控制台代码
namespace Demo
{
class Program
{
static void Main(string[] args)
{
//创建spring.net统一入口
IApplicationContext ctx = ContextRegistry.GetContext();
//控制反转,实例创建由容器创建
IUserInfo dal = ctx.GetObject("UserInfo") as IUserInfo;
dal.Show();
Console.ReadLine();
}
}
}
总结
从三种方式来对比了实例化一个对象的三种方式,第一种是利用面向接口编程的思想,让实现依赖接口,这样的耦合度还是很大。第二种方式利用抽象工厂加反射,这种方式可以完全不用考虑实现接口的类,直接利用工厂获取一个实例,这种方式达到了松耦合的效果;第三种方式应该也是利用了工厂模式的方式,而整个IoC更像一个封装好的工厂,只要我们写配置文件就可以实例对象,更加简单,也更灵活。