Dependency injection StructureMap特定构造函数-应如何初始化参数?

Dependency injection StructureMap特定构造函数-应如何初始化参数?,dependency-injection,inversion-of-control,structuremap,Dependency Injection,Inversion Of Control,Structuremap,给定StructureMap注册表的以下部分 For<ILogger>().Use(LogFactory.CreateLogger()); For<Scheduler>().Use(() => new Scheduler(ObjectFactory.GetInstance<ILogger>())); For().Use(LogFactory.CreateLogger()); For()。使用(()=>newscheduler(ObjectFactory

给定StructureMap注册表的以下部分

For<ILogger>().Use(LogFactory.CreateLogger());
For<Scheduler>().Use(() => new Scheduler(ObjectFactory.GetInstance<ILogger>()));
For().Use(LogFactory.CreateLogger());
For()。使用(()=>newscheduler(ObjectFactory.GetInstance());

…这是一种向
调度程序提供
ILogger
好方法吗?它可以工作-但我很想知道它是否是提供容器配置为提供的类型的糟糕方法,或者它是否是给定场景的唯一选项。。。这种情况下,
调度程序
类型本身具有其他构造函数,我无法更改,也不关心这些构造函数-但它们是必需的,因此我需要指定此特定构造函数,而不是使用直接的
for()。Use()

如果注册的服务正好有一个公共构造函数,那将是最好的。这使得服务具有明确的依赖关系,并且非常清楚容器将选择哪个构造函数,并且允许您使用更灵活的
Use()
,注册类型,并且使组合根在构造函数更改时不太可能更改


但是,正如您所说的,在您的情况下,您不能更改该类型的构造函数,因此您必须后退。使用StructureMap选择合适的构造函数有多种方法,但注册委托是最好的方法,因为这可以为您提供编译时支持。

如果注册的服务只有一个公共构造函数,那就最好了。这使得服务具有明确的依赖关系,并且非常清楚容器将选择哪个构造函数,并且允许您使用更灵活的
Use()
,注册类型,并且使组合根在构造函数更改时不太可能更改


但是,正如您所说的,在您的情况下,您不能更改该类型的构造函数,因此您必须后退。使用StructureMap选择合适的构造函数有多种方法,但注册委托是最好的方法,因为这可以为您提供编译时支持。

谢谢您的支持-因此,本质上,我所做的是在特定情况下“尽我所能”。我当然更喜欢单一的ctor类型,而且在大多数情况下,我是这样做的。谢谢你,所以本质上,考虑到目前的情况,我所拥有的是“尽我所能”。我当然更喜欢使用单ctor类型,在大多数情况下,我是这样做的。
for().Use(c=>newscheduler(c.GetInstance())-使用提供容器构建上下文的重载,而不是ObjectFactory。@JoshuaFlanagan+1,非常好-谢谢,这使它看起来更漂亮。
for()。使用(c=>new Scheduler(c.GetInstance())-使用提供容器构建上下文的重载,而不是ObjectFactory。@JoshuaFlanagan+1,非常好-谢谢你,这让它看起来更漂亮了。