2012-03-23 70 views
4

在autoFac中,我可以注册一个接口的多个实现。当autofac实例化我的对象时,所有实例都传递给构造函数。Autofac与Structuremap,我如何注入接口的所有实例?

从autofac的文档:here

例如,当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) 
     { 

     } 
    } 
} 

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

回答

6

在StructureMap,你可以这样做:

ObjectFactory.Intialize(x => x.Scan(y => y.AddAllTypesOf<IFoo>())); 

这将注册各类IFoo

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

编辑:

我赶紧一个控制台应用程序写这件事:

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

var usingFoo = ObjectFactory.GetInstance<UsingFoo>(); 

编辑:

你让我怀疑我自己,所以我仔细检查了。

它工作正常。

这里有一个工作的例子,我在一个控制台应用程序快速地写道:

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(); 
    } 
} 

输出是:

这是美孚1

这是富2

完成

+0

我不认为你是对的。这只会注入一个IFoo实例。我需要SM将IFoo的所有实例注入IEnumerable 。 – rboarman 2012-03-27 17:15:30

+0

@rboarman用一个工作示例更新了我的答案。 – Phill 2012-03-28 23:51:48