我在TaskRegistry中定义了一些ITask混凝土类型: public class TaskResigstry : Registry{ public TaskResigstry() { ForRequestedTypeIBootstrapperTask().TheDefaultIsConcreteTypeStartTasks(); ForRequestedTypeITask().TheDefaultIsConcre
public class TaskResigstry : Registry
{
public TaskResigstry()
{
ForRequestedType<IBootstrapperTask>().TheDefaultIsConcreteType<StartTasks>();
ForRequestedType<ITask>().TheDefaultIsConcreteType<FirstTask>();
ForRequestedType<ITask>().AddConcreteType<SecondTask>();
ForRequestedType<ITask>().AddConcreteType<ThirdTask>();
}
}
还有我的StartTasks
public class StartTasks : IBootstrapperTask
{
public StartTasks(ITask[] tasks)
{
foreach(var task in tasks)
{
task.Run();
}
}
}
如何使用StructureMap注入ITask []构造函数参数?
谢谢.
如果你想注入一个数组,那么在流畅的界面中有一个方法…ForRequestedType<IBootStrapperTask>().TheDefault.Is.OfConcreteType<StartTasks>()
.TheArrayOf<ITask>().Contains(
y => {
y.OfConcreteType<Task1>();
y.OfConcreteType<Task2>();
y.OfConcreteType<Task3>();
});
如果你想沿着接受IEnumerable< T>的路线走下去.在你的构造函数中,据我所知,事情开始变得有点复杂.您可以像这样指定和构建构造函数参数: –
ForRequestedType<IBootStrapperTask>().TheDefault.Is.OfConcreteType<StartTasks>()
.CtorDependency<IEnumerable<ITask>>().Is(i => {
i.Is.ConstructedBy(c => {
return new List<ITask> {
c.GetInstance<Task1>(),
c.GetInstance<Task2>(),
c.GetInstance<Task3>()
};
});
});
如果你想要所有已注册的类型,你可以创建一个自定义IBuildInterceptor,通过BuildSession上的CreateInstanceArray方法访问所有已注册的类型,但我觉得我可能会走错路.
我很乐意纠正这个更容易:).
