How to programmatically register a component that depends on a list of already registered components with Castle Windsor?

I programmatically register a group of services that implement the same IRule interface. I have another service that looks like this:

public class MyService {
    private IEnumerable<IRule> _rules;
    public MyService(IEnumerable<IRule> rules){
        _rules = rules;
    }
}

Hammett posted what looked like what I wanted, http://hammett.castleproject.org/?p=257 . I changed the signature to IRule [] and tried the ArrayResolver trick in the message, but this did not work for me (note that this did not break either).

Does anyone know how to programmatically register a component, such as the code that I posted above?

+3
source share
2

Castle.MicroKernel , ArrayResolver ListResolver ( Castle.MicroKernel.Resolvers.SpecializedResolvers). , () Hammet, , , , .

, , : http://www.panteravb.com/downloads/WindsorCon.zip

ArrayResolver, ListResolver, , , , :

public class MyService
{
    private IEnumerable<IRule> _rules;
    public MyService(IList<IRule> rules)
    {
        _rules = rules;
    }
}

:

private IWindsorContainer _container;
private void InitializeIoc()
{
    _container = new WindsorContainer();
    _container.Kernel.Resolver.AddSubResolver(new ListResolver(_container.Kernel));
    _container.Register(Component.For<IRule>().ImplementedBy<Rule1>());
    _container.Register(Component.For<IRule>().ImplementedBy<Rule2>());
    _container.Register(Component.For<MyService>());
}
+2

MyService IEnumerable<IRule>, ISubDependencyResolver. , :

public class EnumerableResolver : ISubDependencyResolver
{
    private readonly IKernel kernel;

    public EnumerableResolver(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
    {
        Type targetType = dependency.TargetType;
        if (targetType == null)
        {
            throw new ArgumentException("TargetType property cannot be null", "dependency");
        }

        if (targetType.IsGenericType && (targetType.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
        {
            Type service = targetType.GetGenericArguments()[0];
            return this.kernel.HasComponent(service);
        }
        return false;
    }

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
    {
        Type service = dependency.TargetType.GetGenericArguments()[0];
        Array array = this.kernel.ResolveAll(service, (IDictionary)null);
        return Activator.CreateInstance(typeof(List<>).MakeGenericType(new Type[] { service }), new object[] { array });
    }
}

:

container.Kernel.Resolver.AddSubResolver(new EnumerableResolver(this.Kernel));
+6

Source: https://habr.com/ru/post/1728531/


All Articles