2011-06-09 28 views
0

我想为IoC容器返回的应用程序的一部分定义一个外观,在我的情况下是StructureMap。 Facade有一个构造函数,它没有设置默认实现的参数,而另一个是我可以定义Facade管理的不同子系统对象的自定义实现。StructureMap和外墙

但是,由于StructureMap试图使用最多参数调用构造函数的外观实例,因此如果未注册其他子系统的实现,它将失败。

我的问题是:有没有什么办法告诉StructureMap尝试使用下面的构造函数,如果它不能使用主要的?或者我必须告诉StructureMap选择哪个构造函数?

+0

也许有点示例代码将一些可视化的帮助。 – IAbstract 2011-06-09 13:16:07

+0

如果可能,始终只有一个带参数的构造函数。不要创建一个初始化类型的默认构造函数。这样,你的类型仍然与具体的依赖关系紧密结合,这使得它很难交换。让StructureMap完成它的工作。 – Steven 2011-06-09 13:42:30

+0

使用带参数的单个构造函数虽然仍然很少,但在这种情况下,大多数情况下会超出使用外观的目的。关于添加一些示例,我不知道是否真的需要,毕竟,我的问题不需要太多的代码。如果有一个具有多个构造函数的类,那么StructureMap将选择第一个具有更大数字的参数,如果参数,我想知道的是如果StructureMap在异常情况下可以以某种方式使用其他构造函数作为回退。 – Neverbirth 2011-06-09 14:18:49

回答

1

据我所知,不可能让StructureMap试图解决一个实例,并且如果不成功的话最好还是回到替代ctors。

我认为使用StructureMap连接外观的依赖关系也是一个好主意,并在那里指定默认值。也许可以使用Null对象实现作为可能缺失的子系统的默认对象。

+0

我也想过它,但我想知道StructureMap是否能够做我想问的问题。我认为这将是一个很好的补充,不是吗? – Neverbirth 2011-06-09 14:21:06

1

您可以指定一个委托,将如下创建您的类型:

container.Configure(r => r.For<IFacade>().Use(() => new RealFacade())); 
+1

好点,比我的解决方案好(为什么这是一种熟悉的感觉) – thekip 2011-06-09 17:14:58

+0

是的,我也意识到了这一点,尽管我更喜欢在这种情况下使用构造函数选择器。无论如何,只是我的个人品味,因为我不知道他们是否有任何优势或劣势,也许这种其他选择更好,也许这个好可能成为其他线程的主题。 – Neverbirth 2011-06-09 21:40:26

+0

@Neverbirth:根据您使用的DI容器,直接调用构造函数可能有缺点。 *简单的注射器*,例如,不会对该类型进行任何后期初始化(使用'RegisterInitializer'方法)。 *另一方面,StructureMap *(使用'OnCreationForAll'方法)。据我所知,Unity *甚至没有这样的功能。无论哪种方式,当您向构造函数添加依赖项时,必须更改DI配置。这是明显的缺点。 – Steven 2011-06-10 06:53:25