Asp.net核心选项类需要类实例作为参数,如果类使用DI引用怎么办?

时间:2016-11-02 11:49:57

标签: dependency-injection asp.net-core

在startup.cs中我有

services.AddAuthorization(options =>
{
    options.AddPolicy("RequireSomething", policy => policy.Requirements.Add(new SomeRequirement()));
});

如果SomeRequirement -class需要一个只能通过依赖注入获得的类,如下所示。我不能/不想实例化SomeRequirement。

public class SomeRequirement : AuthorizationHandler<SomeRequirement>, IAuthorizationRequirement
{
    ISomething _something;
    public SomeRequirement(ISomething something)
    {
        _something = something;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SomeRequirement requirement)
    {
        //TODO Do stuff
        return Task.CompletedTask;
    }
}

1 个答案:

答案 0 :(得分:0)

我建议有两种解决办法。

  1. 我假设您具有ISomething的具体实现。如果您知道初始化并将其作为参数传递给参数。这是一个简短而又甜蜜的解决方案。

  2. 第二种解决方案有点尴尬。

    • ASP.net Core中可用的默认DI容器不支持属性注入。

    • 尝试使用Autofac或其他支持属性注入的DI容器,而不是使用默认DI容器。

  3. 更新1:可能的解决方案。 (使用ASP.net Core的默认DI)

    public class SomeRequirement : AuthorizationHandler<SomeRequirement>, IAuthorizationRequirement
    {
    
        ISomething _something;
        public SomeRequirement(ISomething something)
        {
            _something = something;
        }
    
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SomeRequirement requirement)
        {
            //TODO Do stuff
            return Task.CompletedTask;
        }
    }
    
    public interface ISomething
    {
    
    }
    
    public class Something : ISomething
    {
    
    }
    

    在ConfigureService中

    services.AddSingleton<ISomething, Something>();
    services.AddScoped(typeof(SomeRequirement));
    services.AddAuthorization(options =>
                {                
    options.AddPolicy("RequireSomething", policy => policy.Requirements.Add(services.BuildServiceProvider().GetRequiredService<SomeRequirement>()));
                });