常见项目的存储库模式

时间:2012-08-07 14:45:16

标签: c# unit-testing repository

您好我是存储库模式的新手。我希望得到关于我所遵循的方法的反馈。

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

我的解决方案:

  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; }
    }
    
  4. 在实现ICommonService的类上,我使用上下文获取当前用户,换句话说,我的服务层不知道HttpContext,因为这可能会用于另一种类型的应用程序未来。因此,我可以通过不同方式为当前用户处理所有应用程序,但我的服务层不会介意。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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