• 在WebApi 中使用AutoFac (二)


    WebApi 中使用AutoFac  (一)

    前篇说了怎么使用AutoFac,但是还存在一个问题,就是一个接口多个实现类的时候,怎么区分实现类?

    解决办法有很多,有 Named<T>等等,但是都需要去分别单独注册,少的话可以,多了就有点儿麻烦了。

    最后决定利用泛型解决该问题。

    第一步:新增一个实现类:UsersRepository2

        public interface IUsersRepository
        {
            int GetUserIsExists(UsersEntity criteria);
    
        }
    
        //实现类1
        public class UsersRepository : IUsersRepository
        {
            Logger log = LogManager.GetLogger("UsersRepository");
    
            /// <summary>
            /// 获取用户是否存在
            /// </summary>
            /// <param name="criteria"></param>
            /// <returns></returns>
            public int GetUserIsExists(UsersEntity criteria)
            {
                string sql = "。。。。";
    。。。。。 } }
    //实现类2
    public class UsersRepository2 : IUsersRepository { Logger log = LogManager.GetLogger("UsersRepository2"); /// <summary> /// 获取用户是否存在 /// </summary> /// <param name="criteria"></param> /// <returns></returns> public int GetUserIsExists(UsersEntity criteria) { string sql = "。。。。"; 。。。。。 } }

    第二步:调整服务接口和实现类

     1     public enum UsersType
     2     {
     3         /// <summary>
     4         /// 实现类1
     5         /// </summary>
     6         [Description("实现类1")]
     7         UsersRepository = 1,
     8         /// <summary>
     9         /// 实现类2
    10         /// </summary>
    11         [Description("实现类2")]
    UsersRepository2 = 2,
    12 } 13 14 //调整服务接口 15 public interface IUsersService 16 { 17 int GetUserIsExists<T>(T t, UsersEntity criteria); //这里改为泛型方法 18 } 19 20 //调整实现类 21 public class UsersService : IUsersService 22 { 23 //这里改为使用 IEnumerable<T>类型 24 private readonly IEnumerable<IUsersRepository> _usersrepository; 25 public UsersService(IEnumerable<IUsersRepository> usersrepository) 26 { 27 _usersrepository = usersrepository; 28 } 29 30 /// <summary> 31 /// 获取用户是否存在 32 /// </summary> 33 /// <param name="criteria"></param> 34 /// <returns></returns> 35 public int GetUserIsExists<T>(T t, UsersEntity criteria) 36 { 37 //根据泛型T 获取想要的实例对象 38 var getinstance = _usersrepository.Where(ob => ob.GetType().Name == t.ToString()).FirstOrDefault(); //获取指定实例 39 if (getinstance != null) 40 { 41 return getinstance.GetUserIsExists(criteria); 42 } 43 return 0; 44 } 45 }

    第三步:测试

     1     public class UsersController : ApiController
     2     {
     3         private readonly IUsersService _usersService;
     4         public UsersController(IUsersService usersService)
     5         {
     6             _usersService = usersService;
     7         }
     8 
     9 
    10         /// <summary>
    11         /// 获取用户是否存在
    12         /// </summary>
    13         /// <param name="username"></param>
    14         /// <param name="password"></param>
    15         /// <returns></returns>
    16         [HttpPost]
    17         public IHttpActionResult GetUserIsExists(string username, string password)
    18         {
    19             //验证是否存在当前用户
    20             var obModel = new UsersEntity()
    21             {
    22                 Username = username,
    23                 Password = Encryption.MD5(password)
    24             };
    25 
    26             //这里调用时,传入枚举:UsersType.UsersRepository 或 UsersType.UsersRepository2
    27             var getresult = _usersService.GetUserIsExists(UsersType.UsersRepository, obModel);
    28 
    29             return Json(new { isexists = getresult > 0 });
    30         }
    31 
    32 
    33     }

    我们分别把两个实现类都打上断点,

    当传 UsersType.UsersRepository 时,UsersRepository类的断点进来了,

     当传 UsersType.UsersRepository2 时,UsersRepository2类的断点进来了,

    当然,这里是分开执行实现类的,如果你想执行全部的实现类,只需要把服务类里边的泛型筛选去掉就行了

    例如:

     1     public class UsersService : IUsersService
     2     {
     3         //这里改为使用 IEnumerable<T>类型
     4         private readonly IEnumerable<IUsersRepository> _usersrepository;
     5         public UsersService(IEnumerable<IUsersRepository> usersrepository)
     6         {
     7             _usersrepository = usersrepository;
     8         }
     9 
    10         /// <summary>
    11         /// 获取用户是否存在
    12         /// </summary>
    13         /// <param name="criteria"></param>
    14         /// <returns></returns>
    15         public int GetUserIsExists<T>(T t, UsersEntity criteria)
    16         {
    17             //根据泛型T 获取想要的实例对象
    18             //var getinstance = _usersrepository.Where(ob => ob.GetType().Name == t.ToString()).FirstOrDefault();  //获取指定实例
    19             //if (getinstance != null)
    20             //{
    21             //    return getinstance.GetUserIsExists(criteria);
    22             //}
    23 
    24             //这里调整代码为 执行全部的实现类
    25             var getresult = 0;
    26             _usersrepository.ToList().ForEach(item =>
    27             {
    28                 var gettype = item.GetType().Name;
    29                 switch (gettype)
    30                 {
    31                     case "UsersRepository":
    32                         //其他业务逻辑
    33                         getresult = item.GetUserIsExists(criteria);
    34                         break;
    35                     //case 2 .....
    36                     //case 3 .....
    37                     default:
    38                         break;
    39                 }
    40             });
    41             return 0;
    42         }
    43     }

    结束。

  • 相关阅读:
    蓝桥杯历届试题 幸运数 链表模拟
    最小路径覆盖和最小边覆盖及相关性质
    HDU 1724 Ellipse 自适应simpson积分
    [kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads
    [ An Ac a Day ^_^ ][kuangbin带你飞]专题六 最小生成树 POJ 2031 Building a Space Station
    Codeforces Round #390 (Div. 2)
    数据结构 有向图的非递归遍历
    数据结构 二叉树
    vi/vim基本使用方法
    网络赛用头文件
  • 原文地址:https://www.cnblogs.com/peterzhang123/p/12883679.html
Copyright © 2020-2023  润新知