Autofac和RegisterGeneric-限制允许的泛型

时间:2018-07-13 17:37:39

标签: c# .net dependency-injection autofac

假设我在Autofac进行了通用注册:

builder.RegisterGeneric(typeof(Injectator<>))
       .As(typeof(IInjectator<>))
       .SingleInstance();

现在(I)注入器具有单个泛型。但是我不希望所有可能的类或结构都被通用。

我只希望从某些指定的类继承的类:

class JustClass { // not allowed
}

class SpecialClass : InjectableClass { // allowed
}

1 个答案:

答案 0 :(得分:1)

最简单的方法是在通用接口上添加约束:

public interface IInjectator<T> 
    where T : InjectableClass 
{ }

.net不允许您使用无效的类型。

如果您不能执行此操作,则没有简单的方法可以更改RegisterGeneric的行为,我可以看到的一种方法是订阅OnActivated事件并引发异常:

builder.RegisterGeneric(typeof(Foo<>))
        .As(typeof(IFoo<>))
        .OnActivated(e =>
        {
            Boolean isValid = e.Component.Services
                .OfType<IServiceWithType>()
                .Where(s => s.ServiceType.IsConstructedGenericType
                            && s.ServiceType.GetGenericTypeDefinition() == typeof(IFoo<>)
                            && s.ServiceType.GetGenericArguments()[0].IsAssignableTo<IBar>())
                .Any();

            if (!isValid)
            {
                throw new Exception("boom");
            }
        });

如果您不想引发异常,则可以实现自己的IRegistrationSource。您可以查看本机OpenGenericRegistrationSource的源代码,该源代码可以解析开放的泛型类型。

相关问题