.NET Core WebAPI依赖注入解析null

2023-11-26

我使用具有依赖注入和多个身份验证模式(http basic、访问密钥、JWT)的 .NET Core WebAPI。我注入一些需要一些经过身份验证的用户数据的业务服务。如果用户通过任何身份验证中间件进行身份验证,DI 就可以正常工作。如果用户未经过身份验证,DI 无法解析某些服务。我需要 DI 才能返回null.

这怎么可能?下面的代码将导致异常,null结果是不允许的。

services.AddTransient<IMasterRepository>(serviceProvider =>
        {
            var _serviceFactory = new RepositoriesFactory(Configuration);

            if (!Authenticated)
            {
                return null;
            }

            return _serviceFactory.CreateMasterRepository();
        });

另外,我无法在身份验证中间件中返回 401,因为另一个中间件可能会成功(说明:无法在 http 基本身份验证中间件中返回 401,因为下一个中间件 JWT 可能会成功)

另外,我无法在所有身份验证中间件之后添加“需要身份验证”检查,因为某些控制器是公共的(不需要身份验证/依赖项注入)。

有什么建议吗? 谢谢!


没有问题注册一个实现为null。它只在解决你会遇到问题。

换句话说,如果您注册:

services.AddTransient<IMasterRepository>(provider => null);

然后尝试:

private readonly IMasterRepository _repository;

public SomeController(IMasterRepository repository)
{
    _repository = repository;
}

您将得到一个InvalidOperationException在运行时,显示类似于以下内容的消息:

尝试激活“MyApp.Controllers.SomeController”时无法解析类型“MyApp.IMasterRepository”的服务

However,有一个简单的解决方法。不是注入接口,而是注入IEnumerable该接口的:

private readonly IMasterRepository _repository;

public SomeController(IEnumerable<IMasterRepository> repositories)
{
    _repository = repositories.First();  // (using System.Linq)
}

你可能认为应该是FirstOrDefault,但是确实会有一个项目包含null你注册了。

这种方法之所以有效,是因为 ASP.Net Core 中的 DI 支持注册给定类型的多个实现,并且不区分null和注册时的对象实例。

请记住,尽管这有效,但不建议这样做,因为现在_repository变量可能可为空,并且每次访问它时都必须使用空检查。例如:if (_repository != null) { _repository.DoSomething(); } or _repository?.DoSomething();。大多数人不希望编写这样的代码。

这涵盖了问题的 DI 部分。但如果问题确实与身份验证有关,那么ste-fu的回答描述了一种更合适的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET Core WebAPI依赖注入解析null 的相关文章

随机推荐