我有一个使用注入(inject)的 BLL 服务的页面:一个简单的服务,返回一组具有如下功能的对象:
public IMyService { List<Foo> All(); }
对于普通用户有一个默认实现。 现在,我需要具有管理角色的用户可以通过该服务的另一个实现来查看更多对象。
我可以在哪里配置我的页面以使用第二种实现?
我的第一个解决方案是将依赖项放入页面中的IUnityContainer,并使用它来解决依赖项:
[Dependency]
public IUnityContainer Container { get; set;}
Page_Init(..)
{
_myService = User.IsInRole(MyRoles.Administrators)
? Container.Resolve<IMyService>("forAdmins")
: Container.Resolve<IMyService>();
}
但它非常丑陋:它是一个 ServiceLocator,而且它既不可扩展又不可测试。
我该如何处理这种情况?也许为每个角色创建一个子容器?
最佳答案
您可以将其实现为Decorator和Composite的组合:
public SelectiveService : IMyService
{
private readonly IMyService normalService;
private readonly IMyService adminService;
public SelectiveService(IMyService normalService, IMyService adminService)
{
if (normalService == null)
{
throw new ArgumentNullException("normalService");
}
if (adminService == null)
{
throw new ArgumentNullException("adminService");
}
this.normalService = normalService;
this.adminService = adminService;
}
public List<Foo> All()
{
if(Thread.CurrentPrincipal.IsInRole(MyRoles.Administrators))
{
return this.adminService.All();
}
return this.normalService.All();
}
}
这遵循单一职责原则,因为每个实现只做一件事。
关于c# - ASP.NET:依赖注入(inject)和角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3288193/