在WebApi 中使用AutoFac (二)

原文:在WebApi 中使用AutoFac (二)

WebApi 中使用AutoFac  (一)

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

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

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

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

在WebApi 中使用AutoFac (二)
    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 = "。。。。"; 。。。。。 } }
在WebApi 中使用AutoFac (二)

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

在WebApi 中使用AutoFac (二)
 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 }
在WebApi 中使用AutoFac (二)

第三步:测试

在WebApi 中使用AutoFac (二)
 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     }
在WebApi 中使用AutoFac (二)

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

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

在WebApi 中使用AutoFac (二)

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

在WebApi 中使用AutoFac (二)

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

例如:

在WebApi 中使用AutoFac (二)
 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     }
在WebApi 中使用AutoFac (二)

结束。

在WebApi 中使用AutoFac (二)

上一篇:在WebApi 中使用AutoFac


下一篇:Asp.Net Core 3.1学习-Web Api 文件上传 Ajax请求以及跨域问题(3)