zoukankan      html  css  js  c++  java
  • 在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     }

    结束。

  • 相关阅读:
    字节跳动在 Go 网络库上的实践
    TCP报文段的首部格式 20字节的固定首部
    网易公开课 文件描述符 索引
    网易新闻App架构重构实践:DDD正走向流行
    货 | 携程是如何做AB实验分流的
    Pusher Channels Protocol | Pusher docs https://pusher.com/docs/channels/library_auth_reference/pusher-websockets-protocol
    避免重复提交?分布式服务的幂等性设计! 架构文摘 今天 点击蓝色“架构文摘”关注我哟 加个“星标”,每天上午 09:25,干货推送! 来源:https://www.cnblogs.com/QG-whz/p/10372458.html 作者:melonstreet
    前置时间(Lead Time),也称前置期、备货周期
    滴滴业务研发的精益实践
    DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口
  • 原文地址:https://www.cnblogs.com/peterzhang123/p/12883679.html
Copyright © 2011-2022 走看看