• .NET依赖注入插件Unity的使用


     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     }
    View Code

         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     }
    IOC操作类

           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的粗略的一个认识,如有不妥,请批评指正。

  • 相关阅读:
    四则运算1
    四则运算3
    数组1
    四则运算单元测试
    四则运算2
    数组3
    数组2
    spring aop对service层日志和异常的处理
    Linux设置开机启动
    数据仓库开发——Kettle使用示例
  • 原文地址:https://www.cnblogs.com/HuberyHu/p/5623953.html
Copyright © 2020-2023  润新知