StructureMap特定的构造函数 - 如何初始化参数?

时间:2012-06-28 10:50:12

标签: dependency-injection inversion-of-control structuremap

给出以下的StructureMap注册表

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

...这是向ILogger提供Scheduler良好方式吗?它工作 - 但我很想知道提供容器配置提供的类型是否是一种糟糕的方式,或者它是否是我给出方案的唯一选择...场景是Scheduler类型本身有其他构造函数,我无法更改,也不关心 - 但它们是必需的,所以我需要指定这个特定的构造函数而不是使用直接For<x>().Use<y>();

1 个答案:

答案 0 :(得分:1)

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

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