当前位置 : 主页 > 编程语言 > c语言 >

c# – 使用StructureMap的数组构造函数依赖项

来源:互联网 收集:自由互联 发布时间:2021-06-25
我在TaskRegistry中定义了一些ITask混凝土类型: public class TaskResigstry : Registry{ public TaskResigstry() { ForRequestedTypeIBootstrapperTask().TheDefaultIsConcreteTypeStartTasks(); ForRequestedTypeITask().TheDefaultIsConcre
我在TaskRegistry中定义了一些ITask混凝土类型:

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方法访问所有已注册的类型,但我觉得我可能会走错路.

我很乐意纠正这个更容易:).

网友评论