加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:33:01 所属栏目:百科 来源:网络整理
导读:我在TaskRegistry中定义了一些ITask混凝土类型: public class TaskResigstry : Registry{ public TaskResigstry() { ForRequestedTypeIBootstrapperTask().TheDefaultIsConcreteTypeStartTasks(); ForRequestedTypeITask().TheDefaultIsConcreteTypeFirstTa
我在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方法访问所有已注册的类型,但我觉得我可能会走错路.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读