当意外使用无效密钥时,如何防止Autofac注入null?

时间:2018-10-23 11:46:18

标签: c# dependency-injection autofac nullreferenceexception

我最近遇到了一个问题,其中一个Keyed Service意外地使用了无效的密钥。我在使用枚举,结果发现在第3方库中定义了一个类似的枚举。由于将它们混合在一起,Autofac注入了null依赖项,因此我们不得不调试了一段时间,直到找到原因为止。

我的问题是,如果不存在密钥,是否存在一种机制可以阻止Autofac注入/解析null服务?我想到的是Autofac抛出一个异常,因为它无法像许多其他情况一样解决依赖项。

我创建了一个演示此问题的演示:

void Main()
{
    var builder = new ContainerBuilder();

    builder
        .RegisterType<Class1>()
        .Keyed<IInterface>(Key.First);

    builder
        .RegisterType<Class2>()
        .Keyed<IInterface>(Key.Second);

    builder
        .RegisterType<Class>()
        .WithAttributeFiltering();

    var container = builder.Build();
    var scope = container.BeginLifetimeScope();

    scope.Resolve<Class>().Dump();;
}

interface IInterface { }

class Class1 : IInterface { }
class Class2 : IInterface { }

class Class
{
    public Class([KeyFilter(DifferentKey.First)] IInterface i)
    {
        i.Dump(); // null because the key is wrong
    }
}

enum Key
{
    First,
    Second
}

enum DifferentKey
{
    First,
    Second
}

1 个答案:

答案 0 :(得分:1)

如果在缺少依赖项的情况下确实需要错误,请使用IIndex注入依赖项。

class Class
{

        public Class(IIndex<DataType, ITestItem> list)
        {
            //Throws error if you try to get the instance for unregistered key
            var test = list[DataType.Type2];

        }
}