我在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方法访问所有已注册的类型,但我觉得我可能会走错路.
我很乐意纠正这个更容易:).