.net 结构图和立面

.net 结构图和立面,.net,ioc-container,structuremap,.net,Ioc Container,Structuremap,我正在考虑为IoC容器返回的应用程序的一部分定义一个facade,在我的示例StructureMap中。facade有一个构造函数,没有设置默认实现的参数,还有一个构造函数,因此我可以定义facade管理的不同子系统对象的自定义实现 但是,由于StructureMap试图使facade的实例调用参数最多的构造函数,因此如果没有注册其他子系统的实现,它将失败 我的问题是:如果StructureMap不能使用主构造函数,有没有办法告诉它尝试使用下面的构造函数?或者我必须告诉StructureMap选

我正在考虑为IoC容器返回的应用程序的一部分定义一个facade,在我的示例StructureMap中。facade有一个构造函数,没有设置默认实现的参数,还有一个构造函数,因此我可以定义facade管理的不同子系统对象的自定义实现

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


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

据我所知,StructureMap不可能尝试解析实例,如果使用最贪婪的构造函数不成功,就无法返回到备用构造函数


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

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

container.Configure(r => r.For<IFacade>().Use(() => new RealFacade()));
container.Configure(r=>r.For()。使用(()=>newrealfeacade());

也许一些示例代码有助于可视化。如果可能,请始终使用一个带参数的构造函数。不要创建初始化类型的默认构造函数。这样,您的类型仍然与具体的依赖项紧密耦合,这使得很难进行交换。让StructureMap来完成它的工作。拥有一个带参数的构造函数,虽然仍然很难,但在这种情况下,它会超出拥有facade的目的。关于添加一点示例,我不知道是否真的需要,毕竟,我的问题不需要太多代码。有一个包含多个构造函数的类,StructureMap将选择第一个具有更多if参数的类,我想知道的是StructureMap是否可以在异常情况下以某种方式使用其他构造函数作为回退。我也考虑过这一点,但我想知道StructureMap是否能够满足我的要求。我认为这将是一个很好的补充,不是吗?很好的一点,比我的解决方案更好(为什么这是一种熟悉的感觉)是的,我也知道它,虽然我更喜欢在这种情况下使用构造函数选择器。不管怎样,这只是我个人的喜好,因为我不知道它们是否有任何优点或缺点,也许这个其他选项更好,也许这个井可能是其他线程的主题。@Neverbirth:直接调用构造函数可能有缺点,这取决于您使用的DI容器。例如,Simple Injector不会对该类型执行任何后期初始化(使用
RegisterInitializer
方法)。另一方面,StructureMap则是(使用
OnCreationForAll
方法)。据我所知,Unity甚至没有这样的功能。无论哪种方式,当您向构造函数添加依赖项时,您都必须更改DI配置。这是明显的缺点。