c# - 防止简单注入(inject)器在解析未注册服务时抛出异常

标签 c# .net dependency-injection ioc-container simple-injector

我想知道 Simple Injector 是否有一个选项可以在 GetInstance(Of TService) 返回 Nothing 时停止抛出异常?它现在似乎正在抛出它们,因为我有两个获取实例的请求,但它不存在,并且抛出异常。

是否有办法阻止默认行为、某处设置或其他方式?

最佳答案

绝对有一种简单的方法可以做到这一点。 SimpleInjector.Container 实现了 System.IServiceProvider ,它定义了一个 object GetService(Type)方法。当类型未注册时,此方法返回 null。然而,IServiceProvider 是显式实现的,这意味着它不会在正常使用下显示,因此您必须将 Container 转换为 IServiceProvider ,如下图:

IServiceProvider provider = container;
object instance = provider.GetService(typeof(MyClass));

或者你可以在此基础上定义一个扩展方法:

public static bool TryGetInstance<TService>(
    this Container container, out TService instance)
    where TService : class
{
    IServiceProvider provider = container;
    instance = (TService)provider.GetService(typeof(TService));
    return instance != null;
}

我必须承认这个功能有点隐蔽。唯一的地方this method目前解释在引用库中。

请注意,通常注册 Null Object Pattern 会好得多实现(没有任何行为的空实现)而不是调用 TryGetInstance 方法。注入(inject)空对象使应用程序不必担心空引用,这使您的应用程序代码更易于理解和测试。

关于c# - 防止简单注入(inject)器在解析未注册服务时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10076206/

相关文章:

c# - 通过依赖注入(inject)创建 AntiForgeryToken

forms - 父类中的 Symfony 4 setter 注入(inject)

c# - 这种将字符串拆分为数组的扩展方法还可以如何参数化?

c# - 在 foreach 循环中跳过多个值

c# - 字段初始值设定项无法引用 C# 中的非静态字段方法或属性错误

c# - 在 PostgreSQL 查询中将日期时间转换为指定格式

c# - 给菜单项添加点击事件

c# - 一台机器上可以存在多个 CLR 版本吗?

c# - 如何显示具有焦点外观但不焦点的表单?

Java EE 6 @Inject 懒惰?