WebApi 中使用AutoFac (一) 前篇說了怎麼使用AutoFac,但是還存在一個問題,就是一個介面多個實現類的時候,怎麼區分實現類? 解決辦法有很多,有 Named<T>等等,但是都需要去分別單獨註冊,少的話可以,多了就有點兒麻煩了。 最後決定利用泛型解決該問題。 第一步:新增一個實現類: ...
前篇說了怎麼使用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 }
結束。