控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。
IOC容器有很多种:aotufac、Unity、Spring.net等等。。。 这些工具都可以快速的让我们 建立一套低耦合的系统;
但无论使用哪种技术,对于一个新手来说,都是一件很麻烦的事情,你需要大量的阅读和测试才能真正掌握其特性;
今天给大家介绍一下我自己封装的一个IOC容器 GTA.IOC.Helper ,其主要实现是依赖于 aotufac,当然也支持spring.net等其它实现;
开发这个的初衷,是为了降低VE清算柜台的耦合问题,让开发人员在不了解aotufac的情况下,可以对系统降偶;
GTA.IOC.Helper 主要依赖 Autofac、Autofac.Extras.CommonServiceLocator、Microsoft.Practices.ServiceLocation这三个组件;
如何使用呢,我们现在开始说这个:
我们建立 三个类:PlaceOrderBLL、PlaceOrderDAL、IPlaceOrderDAL
IPlaceOrderDAL是数据库操作的接口;
PlaceOrderDAL是继承IPlaceOrderDAL的实现;
PlaceOrderBLL 是调用IPlaceOrderDAL实现具体的业务逻辑;
上面三个类中,我们只需要让 PlaceOrderBLL 继承 GTA.IOC.Helper.BaseBLL ,然后在 其构造函数中
public class PlaceOrderBLL : GTA.IOC.Helper.BaseBLL
{
IPlaceOrderDAL bll;
public PlaceOrderBLL ()
: base()
{
bll = base.GetInstance<IPlaceOrderDAL >();
}
//这里可以实现各种调用bll的方法
}
根据不同的注入方式,需要配置不同的XML文件:
XMLAssemblyIOC.XML,这个最简单,可以直接将整个 接口库的实现进行自动注入;
我们将上面的 PlaceOrderDAL 加入配置文件中;
<?xml version="1.0" encoding="utf-8" ?>
<AssemblyList>
<BusinessLayer>
<Name>下单数据库操作实现</Name>
<Value>PlaceOrderIDAL</Value>
</BusinessLayer>
</AssemblyList>
然后 GTA.IOC.Helper.BaseBLL 会负责将 IPlaceOrderDAL 的实现 实例化,这个IOC就完成了;
当然,IOC的使用,我建议是实现接口的 实现类 为 无参数构造函数,因为这个最简单做IOC;
public class BaseBLL
{
public BaseBLL()
{
var bll = IOCManager.Instance;
}
/// <summary>
/// 获取指定接口的实例
/// </summary>
/// <typeparam name="T">接口对象</typeparam>
/// <returns></returns>
public T GetInstance<T>()
{
try
{
return ServiceLocator.Current.GetInstance<T>();
}
catch (Exception ex)
{
throw new Exception("XMLAssemblyIOC文件中,没有找到适合的配置项: " + ex.Message);
}
}
/// <summary>
/// 获取指定接口的实例,根据Key
/// </summary>
/// <typeparam name="T">接口对象</typeparam>
/// <param name="key">注册时使用的名字</param>
/// <returns>对应接口的实例</returns>
public T GetInstance<T>(string key)
{
try
{
Dictionary<string, object> dictionary =
ServiceLocator.Current.GetAllInstances(typeof(T)).ToDictionary(p => p.GetType().ToString());
//return ServiceLocator.Current.GetInstance<T>(key);
if (dictionary.ContainsKey(key))
return (T)dictionary[key];
else
return default(T);
}
catch (Exception ex)
{
throw new Exception("没有找到合适的实例,根据 Key:" + key + " " + ex.Message);
}
}
}