我遇到了一个架构问题,我希望有人可以帮助我指导一个更理想的策略。我被迫这样做的方式充满了代码味道"。
我有两种不同的"角色"。我已经拥有内置的身份角色,并且我有一组自定义角色(用户组角色)。我将这些用户组角色存储在数据库中,实质上是用户ID,用户组角色ID和用户组ID之间的关系。我使用Ninject依赖注入我的UserGroupService,它处理将具有某些用户组角色的用户分配给用户组的所有CRUD操作。
我的第一个攻击计划是创建一个我可以放置在操作上的自定义授权属性,类似于Identity [Authorize(Role ="")]属性。我没有运气,因为我无法将服务注入属性类(需要无参数构造函数)。
之后没有工作,我的第二个攻击计划是为IPrincipal编写扩展方法,基本上用User.IsInUserGroupRole(" &#34)。这不起作用,因为我无法将服务注入静态类。
目前我被困在包含基于角色逻辑的每个视图的模型中包括一些布尔值。例如:
public ActionResult Navigation()
{
var isSystemAdmin = User.IsInRole("Administrator");
var isUserGroupAdmin = _userGroupService.IsUserGroupAdmin(User.Identity.GetUserId()) && !isSystemAdmin;
var isGeneralUser = !isSystemAdmin && !isUserGroupAdmin;
var model = new NavigationViewModel
{
IsSystemAdmin = isSystemAdmin,
IsUserGroupAdmin = isUserGroupAdmin,
IsGeneralUser = isGeneralUser
};
return PartialView("_Navigation", model);
}
这里的问题是,每当我想确定用户当前所处的角色时,我都必须这样做。它有效,但它有气味。
我在这里遗漏了什么吗?我认为最理想的选择是能够直接从用户调用它的扩展方法策略,但似乎无法使其工作。
答案 0 :(得分:0)
构造函数DI不是访问依赖项的唯一方法。
每个IOC都有一种解决依赖关系的方法,您只需要对IOC容器的引用。因此,即使您的属性需要无参数构造函数,您仍然可以手动解析依赖关系。
这样的事情应该会有所帮助:
http://www.c-sharpcorner.com/UploadFile/47fc0a/resolving-dependency-using-ninject/
以这种方式使用您的IOC是一种很好的方式吗?可能不是,但它肯定胜过你现在正在做的事情。