gpt4 book ai didi

c# - .NET Core WebAPI 依赖注入(inject)解析 null

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:30 25 4
gpt4 key购买 nike

我将 .NET Core WebAPI 与依赖注入(inject)和多个身份验证模式(http 基本、访问 key 、JWT)结合使用。我注入(inject)了一些需要一些经过身份验证的用户数据的业务服务。如果用户通过任何身份验证中间件进行身份验证,则 DI 可以正常工作。如果用户未通过身份验证,则 DI 无法解析某些服务。我需要 DI 返回 null

这怎么可能?以下代码将导致异常,null 不允许作为结果。

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

if (!Authenticated)
{
return null;
}

return _serviceFactory.CreateMasterRepository();
});

此外,我无法在 auth 中间件中返回 401,因为另一个中间件可能会成功(例如:无法在 http 基本 auth 中间件中返回 401,因为下一个 JWT 可能会成功)

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

有什么建议吗?谢谢!

最佳答案

将实现注册null 没有问题。只有在解决中,你才会遇到问题。

换句话说,如果您注册:

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

然后尝试:

private readonly IMasterRepository _repository;

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

您将在运行时收到 InvalidOperationException,消息类似于:

Unable to resolve service for type 'MyApp.IMasterRepository' while attempting to activate 'MyApp.Controllers.SomeController'

但是,有一个简单的解决方法。不是注入(inject)接口(interface),而是注入(inject)该接口(interface)的 IEnumerable:

private readonly IMasterRepository _repository;

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

您可能认为它应该是 FirstOrDefault,但确实会有一个项目包含您注册的 null

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

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

这涵盖了问题的 DI 部分。但是,如果确实问题出在 auth 那么 ste-fu's answer描述了一种更合适的方法。

关于c# - .NET Core WebAPI 依赖注入(inject)解析 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48586610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com