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的所有实现?
在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
完成
| 归档时间: |
|
| 查看次数: |
2319 次 |
| 最近记录: |