Чтобы убрать очевидное, нет ничего плохого в выполнении нулевой проверки в вашем конструкторе.
Существует два метода получения служб DI из инфраструктуры.
Первый - GetService<T>()
.Это будет возвращать нулевое значение, если такая служба не была зарегистрирована.
Вторым является GetRequiredService<T>()
. выдает исключение , если служба не может быть найдена.
Оба эти метода выдают исключения, если они не могут полностью создать экземпляр службы, которую вы запрашиваете.
class Program
{
static void Main(string[] args)
{
var services = new ServiceCollection()
.AddTransient<IServiceB, ServiceB>()
.BuildServiceProvider();
var servB = services.GetService<IServiceB>();
}
}
public interface IServiceA { }
public interface IServiceB { }
public class ServiceA : IServiceA { }
public class ServiceB : IServiceB { public ServiceB(IServiceA a) { } }
В этом примере для ServiceB
требуется IServiceA
, но A
не добавляется в граф зависимостей.Последний метод вызовет исключение:
System.InvalidOperationException: 'Невозможно разрешить службу для типа' DITests.IServiceA 'при попытке активировать' DITests.ServiceB '.'
Если бы я вместо этого сделал services.GetService<IServiceA>()
, я бы получил нулевое значение.
Вы можете убедиться в этом сами, посмотрев исходный код GitHub .При вызове любого из методов он в конечном итоге перейдет к методу CreateConstructorCallSite
.Это вызывает исключение, если он не может разрешить зависимости вашего типа.
Что касается ASP.Net Core MVC, он использует GetRequiredService<>()
для получения ваших контроллеров от DIgraph.
В заключение, нет, вам не требуется для выполнения нулевых проверок объектов DI в вашем конструкторе, если вы используете чистый Microsoft DI framework.Как сказал Камило Теревинто, фреймворк не позволяет этого.
Как отмечается в вашем посте, я не видел письменного документа Microsoft, в котором прямо говорится, что вам не нужно
Если вы передаетев IServiceProvider
в качестве аргумента конструктора, и вы разрешаете сервисы из конструктора, , затем вам нужно будет выполнить нулевые проверки.