假设我在Autofac进行了通用注册:
builder.RegisterGeneric(typeof(Injectator<>))
.As(typeof(IInjectator<>))
.SingleInstance();
现在(I)注入器具有单个泛型。但是我不希望所有可能的类或结构都被通用。
我只希望从某些指定的类继承的类:
class JustClass { // not allowed
}
class SpecialClass : InjectableClass { // allowed
}
答案 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
的源代码,该源代码可以解析开放的泛型类型。