5

嗨,我是存储库模式的新手。我想就我所遵循的方法获得反馈。

要求:为当前登录的用户构建菜单。

我的解决方案:

  1. 我创建了一个服务,控制器将调用它来获取菜单项。

    public interface IApplicationHelperService
    {
        List<Menu> GetMenuForRoles();
    }
    
  2. 服务的实现

    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();
         }
    
    }
    
  3. 然后是 CommonService(用于服务中所需的常见项目,例如 CurrentUser

    public interface ICommonService
    {
         IUser CurrentUser { get; }
         string ApplicationName { get; }
    }
    

在实现 ICommonService 的类上,我使用上下文获取当前用户,换句话说,我的服务层不知道 HttpContext,因为将来有可能将其用于另一种类型的应用程序。因此,通过这种方式,当前用户可以对所有应用程序进行不同的处理,但我的服务层不会介意。

所以你应该给出反馈的是,这种将这种公共服务注入所有服务的方法是一种好方法还是有另一种方法这样做,我问的原因是在稍后阶段我将需要当前用户的用于审计目的的详细信息或出现的任何原因。

希望这对某人有意义。:-)

4

1 回答 1

1

我们正在使用类似的方法。不同之处在于,我们没有将 CommonService 对象注入到每个服务中。

我们正在使用 WCF,并且我们已经为 OperationContext 编写了一个扩展来存储用户名等。可以使用静态方法调用来访问此扩展中定义的属性。它比 CommonService 实现具有优势;由于您使用的是 IOC,因此没有直接的方法可以在每个服务调用中将参数传递给 CommonService。例如,如果您在 WCF 调用中发送用户名,则需要在每个构造函数中设置 CurrentUser 的值。

我不知道你是否打算使用 WCF;但关键是:如果您需要将变量传递给您的 CommonService,您最终将在每个构造函数中填充此值。如果您不打算传递变量,那么您可以为您的服务创建一个基类并强制开发人员使用这个基类。

此外,您应该将 CommonService 的生命周期管理器设置为 UnityPerResolveLifeTimeManager,以免在每个构造函数中创建新实例。否则,您最终可能会在每个 Service 中拥有不同的实例。

于 2012-08-07T15:16:16.600 回答