PageRenderTime 45ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/ByteartRetail.Application/Implementation/UserServiceImpl.cs

https://github.com/key-value/ByteartRetail
C# | 457 lines | 330 code | 24 blank | 103 comment | 81 complexity | 97796dccfd77abdbf38e0f749515ceb7 MD5 | raw file
  1. using AutoMapper;
  2. using ByteartRetail.DataObjects;
  3. using ByteartRetail.Domain.Events;
  4. using ByteartRetail.Domain.Model;
  5. using ByteartRetail.Domain.Repositories;
  6. using ByteartRetail.Domain.Services;
  7. using ByteartRetail.Domain.Specifications;
  8. using ByteartRetail.Events;
  9. using ByteartRetail.ServiceContracts;
  10. using System;
  11. using System.Linq;
  12. namespace ByteartRetail.Application.Implementation
  13. {
  14. /// <summary>
  15. /// 表示与“客户”相关的应用层服务的一种实现。
  16. /// </summary>
  17. public class UserServiceImpl : ApplicationService, IUserService
  18. {
  19. #region Private Fields
  20. private readonly IUserRoleRepository userRoleRepository;
  21. private readonly IUserRepository userRepository;
  22. private readonly IRoleRepository roleRepository;
  23. private readonly IShoppingCartRepository shoppingCartRepository;
  24. private readonly ISalesOrderRepository salesOrderRepository;
  25. private readonly IDomainService domainService;
  26. #endregion
  27. #region Ctor
  28. /// <summary>
  29. /// 初始化一个新的<c>UserServiceImpl</c>实例。
  30. /// </summary>
  31. /// <param name="context"></param>
  32. /// <param name="userRepository"></param>
  33. /// <param name="userRoleRepository"></param>
  34. /// <param name="roleRepository"></param>
  35. /// <param name="shoppingCartRepository"></param>
  36. /// <param name="salesOrderRepository"></param>
  37. /// <param name="domainService"></param>
  38. public UserServiceImpl(IRepositoryContext context,
  39. IUserRepository userRepository,
  40. IUserRoleRepository userRoleRepository,
  41. IRoleRepository roleRepository,
  42. IShoppingCartRepository shoppingCartRepository,
  43. ISalesOrderRepository salesOrderRepository,
  44. IDomainService domainService)
  45. : base(context)
  46. {
  47. this.userRepository = userRepository;
  48. this.userRoleRepository = userRoleRepository;
  49. this.roleRepository = roleRepository;
  50. this.shoppingCartRepository = shoppingCartRepository;
  51. this.salesOrderRepository = salesOrderRepository;
  52. this.domainService = domainService;
  53. }
  54. #endregion
  55. protected override void Dispose(bool disposing)
  56. {
  57. if (disposing)
  58. {
  59. }
  60. }
  61. #region IUserService Members
  62. /// <summary>
  63. /// 根据指定的客户信息,创建客户对象。
  64. /// </summary>
  65. /// <param name="userDataObjects">包含了客户信息的数据传输对象。</param>
  66. /// <returns>已创建客户对象的全局唯一标识。</returns>
  67. public UserDataObjectList CreateUsers(UserDataObjectList userDataObjects)
  68. {
  69. if (userDataObjects == null)
  70. throw new ArgumentNullException("userDataObjects");
  71. return PerformCreateObjects<UserDataObjectList, UserDataObject, User>(userDataObjects,
  72. userRepository,
  73. dto =>
  74. {
  75. if (dto.DateRegistered == null)
  76. dto.DateRegistered = DateTime.Now;
  77. },
  78. ar =>
  79. {
  80. var shoppingCart = ar.CreateShoppingCart();
  81. shoppingCartRepository.Add(shoppingCart);
  82. });
  83. }
  84. /// <summary>
  85. /// 校验指定的客户用户名与密码是否一致。
  86. /// </summary>
  87. /// <param name="userName">客户用户名。</param>
  88. /// <param name="password">客户密码。</param>
  89. /// <returns>如果校验成功,则返回true,否则返回false。</returns>
  90. public bool ValidateUser(string userName, string password)
  91. {
  92. if (string.IsNullOrEmpty(userName))
  93. throw new ArgumentNullException("userName");
  94. if (string.IsNullOrEmpty(password))
  95. throw new ArgumentNullException("password");
  96. return userRepository.CheckPassword(userName, password);
  97. }
  98. /// <summary>
  99. /// 禁用指定用户。
  100. /// </summary>
  101. /// <param name="userDataObject">需要禁用的用户。</param>
  102. /// <returns>如果成功,则返回true,否则返回false。</returns>
  103. public bool DisableUser(UserDataObject userDataObject)
  104. {
  105. if (userDataObject == null)
  106. throw new ArgumentNullException("userDataObject");
  107. User user = null;
  108. if (!IsEmptyGuidString(userDataObject.ID))
  109. user = userRepository.GetByKey(new Guid(userDataObject.ID));
  110. else if (!string.IsNullOrEmpty(userDataObject.UserName))
  111. user = userRepository.GetUserByName(userDataObject.UserName);
  112. else if (!string.IsNullOrEmpty(userDataObject.Email))
  113. user = userRepository.GetUserByEmail(userDataObject.Email);
  114. else
  115. throw new ArgumentNullException("userDataObject", "Either ID, UserName or Email should be specified.");
  116. user.Disable();
  117. userRepository.Update(user);
  118. Context.Commit();
  119. return user.IsDisabled;
  120. }
  121. /// <summary>
  122. /// 启用指定用户。
  123. /// </summary>
  124. /// <param name="userDataObject">需要启用的用户。</param>
  125. /// <returns>如果成功,则返回true,否则返回false。</returns>
  126. public bool EnableUser(UserDataObject userDataObject)
  127. {
  128. if (userDataObject == null)
  129. throw new ArgumentNullException("userDataObject");
  130. User user = null;
  131. if (!IsEmptyGuidString(userDataObject.ID))
  132. user = userRepository.GetByKey(new Guid(userDataObject.ID));
  133. else if (!string.IsNullOrEmpty(userDataObject.UserName))
  134. user = userRepository.GetUserByName(userDataObject.UserName);
  135. else if (!string.IsNullOrEmpty(userDataObject.Email))
  136. user = userRepository.GetUserByEmail(userDataObject.Email);
  137. else
  138. throw new ArgumentNullException("userDataObject", "Either ID, UserName or Email should be specified.");
  139. user.Enable();
  140. userRepository.Update(user);
  141. Context.Commit();
  142. return user.IsDisabled;
  143. }
  144. /// <summary>
  145. /// 根据指定的用户信息,更新用户对象。
  146. /// </summary>
  147. /// <param name="userDataObjects">需要更新的用户对象。</param>
  148. /// <returns>已更新的用户对象。</returns>
  149. public UserDataObjectList UpdateUsers(UserDataObjectList userDataObjects)
  150. {
  151. return PerformUpdateObjects<UserDataObjectList, UserDataObject, User>(userDataObjects, userRepository,
  152. udo => udo.ID,
  153. (u, udo) =>
  154. {
  155. if (!string.IsNullOrEmpty(udo.Contact))
  156. u.Contact = udo.Contact;
  157. if (!string.IsNullOrEmpty(udo.PhoneNumber))
  158. u.PhoneNumber = udo.PhoneNumber;
  159. if (udo.ContactAddress != null)
  160. {
  161. if (!string.IsNullOrEmpty(udo.ContactAddress.City))
  162. u.ContactAddress.City = udo.ContactAddress.City;
  163. if (!string.IsNullOrEmpty(udo.ContactAddress.Country))
  164. u.ContactAddress.Country = udo.ContactAddress.Country;
  165. if (!string.IsNullOrEmpty(udo.ContactAddress.State))
  166. u.ContactAddress.State = udo.ContactAddress.State;
  167. if (!string.IsNullOrEmpty(udo.ContactAddress.Street))
  168. u.ContactAddress.Street = udo.ContactAddress.Street;
  169. if (!string.IsNullOrEmpty(udo.ContactAddress.Zip))
  170. u.ContactAddress.Zip = udo.ContactAddress.Zip;
  171. }
  172. if (udo.DeliveryAddress != null)
  173. {
  174. if (!string.IsNullOrEmpty(udo.DeliveryAddress.City))
  175. u.DeliveryAddress.City = udo.DeliveryAddress.City;
  176. if (!string.IsNullOrEmpty(udo.DeliveryAddress.Country))
  177. u.DeliveryAddress.Country = udo.DeliveryAddress.Country;
  178. if (!string.IsNullOrEmpty(udo.DeliveryAddress.State))
  179. u.DeliveryAddress.State = udo.DeliveryAddress.State;
  180. if (!string.IsNullOrEmpty(udo.DeliveryAddress.Street))
  181. u.DeliveryAddress.Street = udo.DeliveryAddress.Street;
  182. if (!string.IsNullOrEmpty(udo.DeliveryAddress.Zip))
  183. u.DeliveryAddress.Zip = udo.DeliveryAddress.Zip;
  184. }
  185. if (udo.DateLastLogon != null)
  186. u.DateLastLogon = udo.DateLastLogon;
  187. if (udo.DateRegistered != null)
  188. u.DateRegistered = udo.DateRegistered.Value;
  189. if (!string.IsNullOrEmpty(udo.Email))
  190. u.Email = udo.Email;
  191. if (udo.IsDisabled != null)
  192. {
  193. if (udo.IsDisabled.Value)
  194. u.Disable();
  195. else
  196. u.Enable();
  197. }
  198. if (!string.IsNullOrEmpty(udo.Password))
  199. u.Password = udo.Password;
  200. });
  201. }
  202. /// <summary>
  203. /// 删除用户。
  204. /// </summary>
  205. /// <param name="userDataObjects">需要删除的用户对象。</param>
  206. public void DeleteUsers(UserDataObjectList userDataObjects)
  207. {
  208. if (userDataObjects == null)
  209. throw new ArgumentNullException("userDataObjects");
  210. foreach (var userDataObject in userDataObjects)
  211. {
  212. User user = null;
  213. if (!IsEmptyGuidString(userDataObject.ID))
  214. user = userRepository.GetByKey(new Guid(userDataObject.ID));
  215. else if (!string.IsNullOrEmpty(userDataObject.UserName))
  216. user = userRepository.GetUserByName(userDataObject.UserName);
  217. else if (!string.IsNullOrEmpty(userDataObject.Email))
  218. user = userRepository.GetUserByEmail(userDataObject.Email);
  219. else
  220. throw new ArgumentNullException("userDataObject", "Either ID, UserName or Email should be specified.");
  221. var userRole = userRoleRepository.Find(Specification<UserRole>.Eval(ur => ur.UserID == user.ID));
  222. if (userRole != null)
  223. userRoleRepository.Remove(userRole);
  224. userRepository.Remove(user);
  225. }
  226. Context.Commit();
  227. }
  228. /// <summary>
  229. /// 根据用户的全局唯一标识获取用户信息。
  230. /// </summary>
  231. /// <param name="ID">用户的全局唯一标识。</param>
  232. /// <param name="spec">查询方式。</param>
  233. /// <returns>包含了用户信息的数据传输对象。</returns>
  234. public UserDataObject GetUserByKey(Guid ID, QuerySpec spec)
  235. {
  236. var user = userRepository.GetByKey(ID);
  237. var userDataObject = Mapper.Map<User, UserDataObject>(user);
  238. if (spec.IsVerbose())
  239. {
  240. var role = userRoleRepository.GetRoleForUser(user);
  241. if (role != null)
  242. {
  243. userDataObject.Role = Mapper.Map<Role, RoleDataObject>(role);
  244. }
  245. }
  246. return userDataObject;
  247. }
  248. /// <summary>
  249. /// 根据用户的电子邮件地址获取用户信息。
  250. /// </summary>
  251. /// <param name="email">用户的电子邮件地址。</param>
  252. /// <param name="spec">查询方式。</param>
  253. /// <returns>包含了用户信息的数据传输对象。</returns>
  254. public UserDataObject GetUserByEmail(string email, QuerySpec spec)
  255. {
  256. if (string.IsNullOrEmpty(email))
  257. throw new ArgumentException("email");
  258. var user = userRepository.GetUserByEmail(email);
  259. var userDataObject = Mapper.Map<User, UserDataObject>(user);
  260. if (spec.IsVerbose())
  261. {
  262. var role = userRoleRepository.GetRoleForUser(user);
  263. if (role != null)
  264. {
  265. userDataObject.Role = Mapper.Map<Role, RoleDataObject>(role);
  266. }
  267. }
  268. return userDataObject;
  269. }
  270. /// <summary>
  271. /// 根据用户的用户名获取用户信息。
  272. /// </summary>
  273. /// <param name="userName">用户的用户名。</param>
  274. /// <param name="spec">查询方式。</param>
  275. /// <returns>包含了用户信息的数据传输对象。</returns>
  276. public UserDataObject GetUserByName(string userName, QuerySpec spec)
  277. {
  278. if (string.IsNullOrEmpty(userName))
  279. throw new ArgumentException("userName");
  280. var user = userRepository.GetUserByName(userName);
  281. var userDataObject = Mapper.Map<User, UserDataObject>(user);
  282. if (spec.IsVerbose())
  283. {
  284. var role = userRoleRepository.GetRoleForUser(user);
  285. if (role != null)
  286. {
  287. userDataObject.Role = Mapper.Map<Role, RoleDataObject>(role);
  288. }
  289. }
  290. return userDataObject;
  291. }
  292. /// <summary>
  293. /// 获取所有用户的信息。
  294. /// </summary>
  295. /// <param name="spec">查询方式。</param>
  296. /// <returns>包含了所有用户信息的数据传输对象列表。</returns>
  297. public UserDataObjectList GetUsers(QuerySpec spec)
  298. {
  299. var users = userRepository.FindAll();
  300. if (users == null)
  301. return null;
  302. var ret = new UserDataObjectList();
  303. foreach (var user in users)
  304. {
  305. var userDataObject = Mapper.Map<User, UserDataObject>(user);
  306. if (spec.IsVerbose())
  307. {
  308. var role = userRoleRepository.GetRoleForUser(user);
  309. if (role != null)
  310. {
  311. userDataObject.Role = Mapper.Map<Role, RoleDataObject>(role);
  312. }
  313. }
  314. ret.Add(userDataObject);
  315. }
  316. return ret;
  317. }
  318. /// <summary>
  319. /// 根据指定的ID值,获取角色。
  320. /// </summary>
  321. /// <param name="id">指定的角色ID值。</param>
  322. /// <returns>角色。</returns>
  323. public RoleDataObject GetRoleByKey(Guid id)
  324. {
  325. return Mapper.Map<Role, RoleDataObject>(roleRepository.GetByKey(id));
  326. }
  327. /// <summary>
  328. /// 获取所有角色。
  329. /// </summary>
  330. /// <returns>所有角色。</returns>
  331. public RoleDataObjectList GetRoles()
  332. {
  333. var roles = roleRepository.FindAll();
  334. RoleDataObjectList result = null;
  335. if (roles != null &&
  336. roles.Count() > 0)
  337. {
  338. result = new RoleDataObjectList();
  339. roles.ToList()
  340. .ForEach(r => result.Add(Mapper.Map<Role, RoleDataObject>(r)));
  341. }
  342. return result;
  343. }
  344. /// <summary>
  345. /// 创建角色。
  346. /// </summary>
  347. /// <param name="roleDataObjects">需要创建的角色。</param>
  348. /// <returns>已创建的角色。</returns>
  349. public RoleDataObjectList CreateRoles(RoleDataObjectList roleDataObjects)
  350. {
  351. return PerformCreateObjects<RoleDataObjectList, RoleDataObject, Role>(roleDataObjects, roleRepository);
  352. }
  353. /// <summary>
  354. /// 更新角色。
  355. /// </summary>
  356. /// <param name="roleDataObjects">需要更新的角色。</param>
  357. /// <returns>已更新的角色。</returns>
  358. public RoleDataObjectList UpdateRoles(RoleDataObjectList roleDataObjects)
  359. {
  360. return PerformUpdateObjects<RoleDataObjectList, RoleDataObject, Role>(roleDataObjects,
  361. roleRepository,
  362. rdo => rdo.ID,
  363. (r, rdo) =>
  364. {
  365. if (!string.IsNullOrEmpty(rdo.Name))
  366. r.Name = rdo.Name;
  367. if (!string.IsNullOrEmpty(rdo.Description))
  368. r.Description = rdo.Description;
  369. });
  370. }
  371. /// <summary>
  372. /// 删除角色。
  373. /// </summary>
  374. /// <param name="roleIDs">需要删除的角色ID值列表。</param>
  375. public void DeleteRoles(IDList roleIDs)
  376. {
  377. PerformDeleteObjects<Role>(roleIDs,
  378. roleRepository,
  379. id =>
  380. {
  381. var userRole = userRoleRepository.Find(Specification<UserRole>.Eval(ur => ur.RoleID == id));
  382. if (userRole != null)
  383. userRoleRepository.Remove(userRole);
  384. });
  385. }
  386. /// <summary>
  387. /// 将指定的用户赋予指定的角色。
  388. /// </summary>
  389. /// <param name="userID">需要赋予角色的用户ID值。</param>
  390. /// <param name="roleID">需要向用户赋予的角色ID值。</param>
  391. public void AssignRole(Guid userID, Guid roleID)
  392. {
  393. var user = userRepository.GetByKey(userID);
  394. var role = roleRepository.GetByKey(roleID);
  395. domainService.AssignRole(user, role);
  396. }
  397. /// <summary>
  398. /// 将指定的用户从角色中移除。
  399. /// </summary>
  400. /// <param name="userID">用户ID值。</param>
  401. public void UnassignRole(Guid userID)
  402. {
  403. var user = userRepository.GetByKey(userID);
  404. domainService.UnassignRole(user);
  405. }
  406. /// <summary>
  407. /// 根据指定的用户名,获取该用户所属的角色。
  408. /// </summary>
  409. /// <param name="userName">用户名。</param>
  410. /// <returns>角色。</returns>
  411. public RoleDataObject GetUserRoleByUserName(string userName)
  412. {
  413. User user = userRepository.GetUserByName(userName);
  414. var role = userRoleRepository.GetRoleForUser(user);
  415. return Mapper.Map<Role, RoleDataObject>(role);
  416. }
  417. public SalesOrderDataObjectList GetSalesOrders(string userName)
  418. {
  419. User user = userRepository.GetUserByName(userName);
  420. var salesOrders = user.SalesOrders;
  421. SalesOrderDataObjectList result = new SalesOrderDataObjectList();
  422. if (salesOrders != null)
  423. {
  424. foreach (var so in salesOrders)
  425. {
  426. result.Add(Mapper.Map<SalesOrder, SalesOrderDataObject>(so));
  427. }
  428. }
  429. return result;
  430. }
  431. #endregion
  432. }
  433. }