Unity是微软模式与实践团队开发的一个轻量级、可扩展的依赖注入容器。下面我结合一个简单的MVC项目实现Unity的配置和使用。
1. 首先我们创建一个MVC4的解决方案,并创建如下的项目
IBaseData是接口项目,包含了一个接口类,以及Model(数据访问使用EF)
接口中定义了一些方法 如下:我们将在业务类中实现具体业务
1 public interface IBaseDataInterface 2 { 3 /// <summary> 4 /// 所有用户列表 5 /// </summary> 6 /// <returns></returns> 7 List<CommonAuthUser> GetAuthUserList(); 8 9 /// <summary> 10 /// 获取当前用户 11 /// </summary> 12 /// <returns></returns> 13 CommonAuthUser GetCurrentUser(); 14 15 /// <summary> 16 /// 用户登录 17 /// </summary> 18 /// <returns></returns> 19 ObjectResult UserLogin(string p_UserName, string p_Pwd, bool p_IsRememberPwd); 20 21 /// <summary> 22 /// 退出系统 23 /// </summary> 24 /// <returns></returns> 25 ObjectResult LogOut(); 26 27 /// <summary> 28 /// 用户名后台验证 29 /// </summary> 30 /// <returns></returns> 31 ObjectResult CheckLoginName(string loginname); 32 }
CBaseData项目主要是接口的实现,具体实现的代码就不贴出来了
然后是数据访问层的DataAccess项目,主要包含数据库上下文和一些数据访问类
还有一个CommonComponents类是公共的一些类库,不做赘述。
2.下面主要将如何安装并配置Unity。
1) 安装
在NuGet管理器中搜索Unity找到插件并安装
安装成功后,在MVC项目的引用中可以看到以下的几个引用,表示安装成功了!
2) 配置
在MVC项目根目录添加一个Unity.config配置文件,内容如下,定义了container,在type中配置了我们要使用的接口
<?xml version="1.0"?> <unity> <container name="BC"> <types> <!--接口模块--> <type type="IBaseData.IBaseDataInterface,IBaseData" mapTo="CBaseData.CBaseDataInterface,CBaseData"></type> </types> </container> </unity>
然后要特别注意一点,这个时候在响应的MVC项目的web.config中的<configuration>标签中添加上<unity configSource="Unity.config" />这句,否则上面的Unity配置文件会
在编译时报错。
同时还要再<configSections>内添加上
<section name="unity"type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration" />
3) 定义IOC操作类,接下来我们要定义一个静态方法提供得到静态的unity实例
1 /// <summary> 2 /// IOC操作类 3 /// </summary> 4 public class UContainer 5 { 6 static IUnityContainer _Container = new UnityContainer(); 7 8 static Dictionary<string, object> fnCache = new Dictionary<string, object>(); 9 10 11 #region 返回容器 12 /// <summary> 13 /// 返回容器 14 /// </summary> 15 private static IUnityContainer Container 16 { 17 get 18 { 19 UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 20 _Container.LoadConfiguration(section, "BC"); 21 //扩展 22 return _Container; 23 } 24 } 25 #endregion 26 27 #region 初始化容器 返回对应对象 28 /// <summary> 29 /// 初始化容器 返回对应对象 30 /// </summary> 31 /// <typeparam name="T"></typeparam> 32 /// <returns></returns> 33 public static T GetInstanse<T>() 34 { 35 string key = "ioc:" + typeof(T).FullName; 36 T _Fn; 37 if (fnCache.Keys.Contains(key)) 38 { 39 _Fn = (T)fnCache[key]; 40 } 41 else 42 { 43 //Container.AddNewExtension<Interception>(); 44 //Container.RegisterType<T>(new Interceptor<InterfaceInterceptor>(), 45 // new InterceptionBehavior<MyInterceptor>()); 46 try 47 { 48 _Fn = Container.Resolve<T>();//获取代理实例类 49 50 } 51 catch (Exception ex) 52 { 53 string a = ex.Message; 54 } 55 _Fn = Container.Resolve<T>();//获取代理实例类 56 fnCache[key] = _Fn; 57 } 58 return _Fn; 59 60 } 61 #endregion 62 }
4) 调用,这样就可以在控制器中或者其他的地方调用实例来实现不同的接口方法
例如在控制器中
1 public class HomeController : AdminBaseController 2 { 3 private IBaseDataInterface _businessBll = UContainer.GetInstanse<IBaseDataInterface>(); 4 /// <summary> 5 /// 系统首页 6 /// </summary> 7 /// <returns></returns> 8 public ActionResult Index() 9 { 10 IBaseDataInterface facade = new CBaseDataInterface(); 11 List<CommonAuthUser> reslist = _businessBll.GetAuthUserList(); 12 ViewBag.ResList = reslist; 13 return View(); 14 } 15 }
这样通过接口泛型可以定义一个私有全局变量,可以直接调用该接口实现类中的所有方法。
5) 扩展,当有新的接口模块加入的时候,可以在配置文件中加入相应的配置,使用起来很方便。
以上内容,是本人使用Unity的粗略的一个认识,如有不妥,请批评指正。