没有问题注册一个实现为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的回答描述了一种更合适的方法。