一个类有一个以IMyInterface为参数的唯一构造函数。如果我定义了一个具体类型的IMyInterface并将其注册到StructureMap,那么就没有问题,我的类可以用这种具体类型进行实例化。
但是,在某些情况下,不会注册具体类型。在这种情况下,我想收到IMyInterface参数的null。相反,我得到一个例外:
StructureMap异常代码:202 没有为PluginFamily IMyInterface定义默认实例。
是否可以为缺失的插件定义默认值?
上下文:我的类是一个服务,它使用Spark视图引擎并定义一些默认命名空间。该服务使用ISparkNamespacesProvider(IMyInterface)来添加aditional名称空间。客户端应用程序可以注册这样的提供者。这就是服务的构造函数将接收提供者或没有提供者的原因。
答案 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/
支持这种情况