2020-05-13

在WebApi 中使用AutoFac (二)

在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   /// 实现类210   /// </summary>11   [Description("实现类2")]
UsersRepository2 = 2,12 }13 14 //调整服务接口 15 public interface IUsersService16 {17 int GetUserIsExists<T>(T t, UsersEntity criteria); //这里改为泛型方法18 }19 20 //调整实现类21 public class UsersService : IUsersService22 {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.UsersRepository227    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  }

结束。


No comments:

Post a Comment