如何使用StructureMap将默认构造函数参数设置为null?

时间:2010-10-06 20:41:01

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

一个类有一个以IMyInterface为参数的唯一构造函数。如果我定义了一个具体类型的IMyInterface并将其注册到StructureMap,那么就没有问题,我的类可以用这种具体类型进行实例化。

但是,在某些情况下,不会注册具体类型。在这种情况下,我想收到IMyInterface参数的null。相反,我得到一个例外:

StructureMap异常代码:202 没有为PluginFamily IMyInterface定义默认实例。

是否可以为缺失的插件定义默认值?

上下文:我的类是一个服务,它使用Spark视图引擎并定义一些默认命名空间。该服务使用ISparkNamespacesProvider(IMyInterface)来添加aditional名称空间。客户端应用程序可以注册这样的提供者。这就是服务的构造函数将接收提供者或没有提供者的原因。

2 个答案:

答案 0 :(得分:2)

取自here

For<IService>().Use<MyService>()
 .Ctor<IMyInterface>("nameOfParameter").Is(null);

但你应该考虑为什么你的班级依赖于IMyInterface。如果它是可选的 - 这是代码味道。也许您应该将其重构为需要它的方法或可设置属性的方法参数。

不应该在具体实现和null之间切换。在组合根处编写依赖关系图时,您应该确切地知道什么是您的依赖关系,而不是.If(isSomething()).Use<MyService>().Ctor<IMyInterface>(null)

您可能需要查看有关DI和IOC的this tekpub演示文稿和this book(寻找所谓的MEAP访问权限)。


实现目标的一种方法是使用所谓的“poor man dependency injection”。那就是 - 定义第二个构造函数:

public MyClass():this(null){...}

但我不建议这样做。

答案 1 :(得分:0)

StructureMap现在通过UseIfNone https://structuremap.github.io/registration/fallback-services/

支持这种情况