Если вы вводите что-то обычным образом (т. Е. Используя ArrayResolver и не вызываете ResolveAll()
напрямую), вы можете обойти его с помощью специального распознавателя массива только для этого типа (или для типов, имеющих эту проблему):
public class CustomArrayResolver : ISubDependencyResolver {
private readonly IKernel kernel;
private readonly Type serviceTypeDefinition;
public CustomArrayResolver(IKernel kernel, Type serviceTypeDefinition) {
this.kernel = kernel;
this.serviceTypeDefinition = serviceTypeDefinition;
}
private bool MatchesConstraints(Type service, Type impl) {
try {
impl.MakeGenericType(service.GetGenericArguments());
return true;
} catch (ArgumentException) {
return false;
}
}
public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver,
ComponentModel model,
DependencyModel dependency) {
var service = dependency.TargetType.GetElementType();
var handlers = kernel.GetAssignableHandlers(service);
var components = handlers
.Where(h => h.CurrentState == HandlerState.Valid)
.Where(h => MatchesConstraints(service, h.ComponentModel.Implementation))
.Select(h => h.Resolve(context, contextHandlerResolver, model, dependency))
.ToArray();
var r = Array.CreateInstance(service, components.Length);
components.CopyTo(r, 0);
return r;
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver,
ComponentModel model,
DependencyModel dependency) {
return dependency.TargetType != null &&
dependency.TargetType.IsArray &&
kernel.HasComponent(dependency.TargetType.GetElementType()) &&
dependency.TargetType.GetElementType().IsGenericType &&
dependency.TargetType.GetElementType().GetGenericTypeDefinition() == serviceTypeDefinition;
}
}
Зарегистрируйте это прямо перед стандартным ArrayResolver:
container.Kernel.Resolver.AddSubResolver(new CustomArrayResolver(container.Kernel, typeof(IIface<,>)));