c# - ASP.NET:依赖注入(inject)和角色

标签 c# asp.net dependency-injection unity-container roles

我有一个使用注入(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,而且它既不可扩展又不可测试。

我该如何处理这种情况?也许为每个角色创建一个子容器?

最佳答案

您可以将其实现为DecoratorComposite的组合:

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/

相关文章:

c# - Xamarin iOS - 如何在绑定(bind)库时包含依赖项?

c# - 实例化代理类 (RealProxy)

c# - 成员(member)提供者和 HIPAA 合规性

c# - 手动注册所有类(class)还是有自动方式?

java - 如何在spring中向各种构造函数注入(inject)值

java - 如何导入来自以另一个类为条件的配置 bean 的 bean?

c# - 从 C# 中的行中提取 GUID

c# - Try/Catch Wrap Around Task.Run 不处理异常

asp.net - HTTP 错误 404.17 - 未找到 - .NET - IIS 10

c# - 使用 Restful asp.net Web api 和安全 API 进行用户登录身份验证