Unity使用ICollection <imyinterface>依赖关系解析构造函数

时间:2018-03-07 12:10:37

标签: c# .net dependency-injection unity-container

我正在编写规则引擎。我有一个许多规则实现的接口IRule。另外,我有一个RuleExecutor,它会注入IEnumerable<IRule>依赖项。

我希望Unity为所有绑定的实现注入IEnumerable<IRule>,但不幸的是它没有工作。

这是我的配置:

container.RegisterType<IRule, RuleA>("a");
container.RegisterType<IRule, RuleB>("b");
container.RegisterType<IRule, RuleC>("c");
container.RegisterType<IRule, RuleD>("d");
container.RegisterType<IRule, RuleE>("e");
container.RegisterCollection<IRule>();

container.RegisterType<IRuleExecutor, RuleExecutor>(new InjectionConstructor(typeof(IEnumerable<IRule>)));

RegisterCollection就是这样:

public static class UnityExtensions
{
    public static void RegisterCollection<T>(this IUnityContainer container) where T : class
    {
        container.RegisterType<IEnumerable<T>>(new InjectionFactory(c => c.ResolveAll<T>()));
    }
}

解析后我收到以下异常消息:

  

RuleExecutor没有带参数()的构造函数。

Unity如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

Unity会自动将所有命名实例注入IEnumerable<T>。这是一个有效的例子。

using System.Collections.Generic;
using Unity;

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();

        container.RegisterType<IRule, RuleA>("a");
        container.RegisterType<IRule, RuleB>("b");
        container.RegisterType<IRule, RuleC>("c");
        container.RegisterType<IRule, RuleD>("d");
        container.RegisterType<IRule, RuleE>("e");
        container.RegisterType<IRuleExecutor, RuleExecutor>();

        var executor = container.Resolve<IRuleExecutor>();
    }
}

public interface IRule { }
public class RuleA : IRule { }
public class RuleB : IRule { }
public class RuleC : IRule { }
public class RuleD : IRule { }
public class RuleE : IRule { }

public interface IRuleExecutor { }
public class RuleExecutor : IRuleExecutor
{
    public RuleExecutor(IEnumerable<IRule> rules)
    {
        // Rules RuleA through RuleE are injected here...
    }
}