Autofac vs. Structuremap,如何注入接口的所有实例?

rbo*_*man 4 structuremap autofac

在autoFac中,我可以注册一个接口的多个实现.当autofac实例化我的对象时,所有实例都将传递给构造函数.

来自autofac的文档:这里

例如,当Autofac注入IEnumerable类型的构造函数参数时,它不会查找提供IEnumerable的组件.相反,容器将找到ITask的所有实现并注入所有这些实现.

StructureMap中是否提供此功能?

对于我的课程:

public interface IFoo
{

}

public class Foo1 : IFoo
{

}

public class Foo2 : IFoo
{

}

public class UsingFoo
{
    public UsingFoo(IEnumerable<IFoo> allFoos)
    {
        foreach (var foo in allFoos)
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何注册我的实现,以便在实例化UsingFoo时,构造函数将传递IFoo的所有实现?

Phi*_*ill 6

在StructureMap中,您可以:

ObjectFactory.Intialize(x => x.Scan(y => y.AddAllTypesOf<IFoo>()));
Run Code Online (Sandbox Code Playgroud)

这将注册所有类型的 IFoo

然后当你解决时UsingFoo,他们会被注入.

编辑:

我只是在控制台应用程序中快速写了这个:

ObjectFactory.Initialize(x =>
{
    x.Scan(y =>
    {
        y.AddAllTypesOf<IFoo>();
    });
});

var usingFoo = ObjectFactory.GetInstance<UsingFoo>();
Run Code Online (Sandbox Code Playgroud)

编辑:

你让我怀疑自己,所以我仔细检查了一下.

它工作正常.

这是我在控制台应用程序中快速编写的一个工作示例:

public interface IFoo
{
    string Text { get; }
}

public class Foo1 : IFoo
{
    public string Text
    {
        get { return "This is from Foo 1"; }
    }
}

public class Foo2 : IFoo
{
    public string Text
    {
        get { return "This is from Foo 2"; }
    }
}

public class Bar
{
    private readonly IEnumerable<IFoo> _myFoos;

    public Bar(IEnumerable<IFoo> myFoos)
    {
        _myFoos = myFoos;
    }

    public void Execute()
    {
        foreach (var myFoo in _myFoos)
        {
            Console.WriteLine(myFoo.Text);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        ObjectFactory.Initialize(x =>
        {
            x.UseDefaultStructureMapConfigFile = false;
            x.Scan(y =>
            {
                y.TheCallingAssembly();
                y.AddAllTypesOf<IFoo>();
            });
        });

        var myBar = ObjectFactory.GetInstance<Bar>();

        myBar.Execute();

        Console.WriteLine("Done");
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

这是来自Foo 1

这是来自Foo 2

完成