inversion-of-control - 如何以编程方式注册依赖于 CaSTLe Windsor 已注册组件列表的组件?

标签 inversion-of-control castle-windsor ioc-container

我正在以编程方式注册一组服务,这些服务都实现了相同的接口(interface) IRule。我有另一个看起来像这样的服务:

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

Hammett 发布了一些看起来像我想要的东西,http://hammett.castleproject.org/?p=257 .我将签名更改为 IRule[] 并在帖子中尝试了 ArrayResolver 技巧,但这对我不起作用(注意,它也没有破坏任何东西)。

有人知道如何像我上面发布的代码那样以编程方式注册组件吗?

最佳答案

如果您不想更改 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));

关于inversion-of-control - 如何以编程方式注册依赖于 CaSTLe Windsor 已注册组件列表的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2068417/

相关文章:

c# - 容器放在哪里?

java - Spring根据请求值使用不同的bean

inversion-of-control - CaSTLe Windsor 如何响应实现多个接口(interface)的类?

delegates - 使用 Windsor 容器注入(inject) Func<T>

java - 一个简单的 IOC 容器类有什么问题?

c# - 如果我不使用 IoC 容器,是否有比单例模式更好的选择来公开我的类的依赖项?

c# - CaSTLe Windsor IoC 将属性注入(inject)构造函数

c# - xxx 类型的方法 'Generate' 没有实现 - S#arp - 已更新

c# - Autofac:使用 in 和 out 类型参数解析变体类型

dependency-injection - 与 MonoTouch 兼容的 IoC 库?