2

一个类有一个以IMyInterface为参数的独特构造函数。如果我定义了IMyInterface的具体类型并将其注册到StructureMap,那么就没有问题,我的类可以通过这个具体类型来实例化。如何使用StructureMap将默认构造函数参数设置为null?

但是,在某些情况下,没有具体的类型将被注册。在这种情况下,我想为IMyInterface参数收到null。相反,我得到一个异常:

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

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

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

回答

2

here摘自:

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

但你应该想想为什么你的等级取决于IMyInterface。如果它是可选的 - 这是一种代码味道。也许你应该重构它作为需要它的方法参数或作为可设置的属性。

应该不需要在具体实现和null之间切换。在合成根目录下编写依赖关系图时,您应该确切知道您的依赖关系(不包括.If(isSomething()).Use<MyService>().Ctor<IMyInterface>(null))。

您可能想要查看关于DI和IOC的this tekpub presentation和this book(查找所谓的MEAP访问)。


一种方法来实现你想要的是使用所谓的'poor man dependency injection'。那就是 - 定义第二个构造函数:

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

但我不会推荐。

+1

null必须转换为IMyInterface以避免模糊的调用。不幸的是它不起作用。当我定义一个具体类型并将其注册到SM时,null仍然通过。所以看起来你的代码并没有定义一个默认参数,而是这个参数的强制值。如果我删除你的代码,则使用具体类型。 – 2010-10-06 21:33:30

+0

@Nicolas在配置中只应该指定一个具体的实现。否则 - 你的设计很可能是错误的。 – 2010-10-06 21:35:55

+0

@Nicolas也许你可以在这里发布需要'IMyInterface'的类吗?构造函数和使用'IMyInterface'的部分。 – 2010-10-06 21:37:37

相关问题