常见项的存储库模式
本文关键字:模式 存储 常见项 | 更新日期: 2024-11-05 20:27:00
嗨,我是存储库模式的新手。我想对我所遵循的方法提供反馈。
要求:为当前登录的用户构建菜单。
我的解决方案 :
-
我创建了一个服务,控制器将调用该服务以获取菜单项。
public interface IApplicationHelperService { List<Menu> GetMenuForRoles(); }
-
服务的实现
public class ApplicationHelperService : IApplicationHelperService { private readonly IMenuRepository _menuRepository; //this fecthes the entire menu from the datastore private readonly ICommonService _commonService; //this is a Service that contained common items eg. UserDetails, ApplicationName etc. public ApplicationHelperService(IMenuRepository menuRepository,ICommonService commonService) { this._menuRepository = menuRepository; this._commonService = commonService; } public List<Menu> ApplicationMenu { get { return _menuRepository.GetMenu(_commonService.ApplicationName); } } List<Menu> IApplicationHelperService.GetMenuForRoles() { return ApplicationMenu.Where(p => p.ParentID == null && p.IsInRole(_commonService.CurrentUser.Roles)).OrderBy(p => p.MenuOrder).ToList(); } }
-
然后是公共服务(用于服务中所需的公共项目,例如。当前用户
public interface ICommonService { IUser CurrentUser { get; } string ApplicationName { get; } }
在实现 ICommonService 的类上,我使用上下文获取当前用户,换句话说,我的服务层不知道 HttpContext,因为将来可能会将其用于其他类型的应用程序。因此,这样我就可以为所有应用程序以不同的方式处理当前用户,但我的服务层不会介意。
所以你应该给出的反馈是,这种将这种公共服务注入所有服务的方法是一种好方法,还是有另一种方法,我问的原因是,在稍后阶段,我将需要当前用户的详细信息进行审计目的或任何原因出现。
希望这对某人有意义。
我们正在使用类似的方法。不同之处在于,我们没有将 CommonService 对象注入到每个服务中。
我们正在使用 WCF,并且我们已经编写了一个扩展到 OperationContext 来存储用户名等。可以使用静态方法调用访问此扩展中定义的属性。它比公共服务实现具有优势;由于您使用的是 IOC,因此无法直接在每个服务调用中将参数传递到 CommonService。例如,如果要在 WCF 调用上发送用户名,则需要在每个构造函数中设置 CurrentUser 的值。
我不知道你是否打算使用 WCF;但重点是:如果你需要将变量传递给你的 CommonService,你最终会在每个构造函数中填充这个值。如果不打算传递变量,则可以只为服务创建一个基类,并强制开发人员使用此基类。
此外,您应该将 CommonService 的生存期管理器设置为 UnityPerResolveLifeTimeManager,以便不在每个构造函数中创建新实例。否则,您最终可能会在每个服务中拥有不同的实例。