.net 命名实例场景的StructureMap注册表DSL

.net 命名实例场景的StructureMap注册表DSL,.net,structuremap,.net,Structuremap,我有一个场景,在这个场景中,我需要能够从StructureMap获得接口IObjectContext的两种不同实现。我知道使用命名实例是答案,但我在DSL中遇到了问题,因为“使用”的类在每种情况下都是相同的,但是使用了不同的构造函数参数 因此,在StructureMap之外创建这些对象的方法如下: IObjectContext context1 = new ObjectContextAdapter(new Model1Entities()); IObjectContext context2 =

我有一个场景,在这个场景中,我需要能够从StructureMap获得接口
IObjectContext
的两种不同实现。我知道使用命名实例是答案,但我在DSL中遇到了问题,因为“使用”的类在每种情况下都是相同的,但是使用了不同的构造函数参数

因此,在StructureMap之外创建这些对象的方法如下:

IObjectContext context1 = new ObjectContextAdapter(new Model1Entities());
IObjectContext context2 = new ObjectContextAdapter(new Model2Entities());
如何在StructureMap注册表DSL中表示此配置?我知道我需要使用命名实例,但我无法理解其余的语法


谢谢

我们最近在尝试注册同一具体类型的多个命名实例时遇到了类似的问题(在我们的示例中,这是在自定义扫描程序中)-Structuremap不允许您直接执行此操作

最后,我们不得不使用ConstructedBy方法,传入一个显式实例化具体类型的表达式

作为起点,这里值得检查

编辑: 我认为这是您在注册表中可能想要的东西(感谢PHeiberg的Add()建议):

For().Add(()=>newObjectContextAdapter(newModel1Entities()).Named(“objectContext1”);
For().Add(()=>newObjectContextAdapter(newModel2Entities()).Named(“objectContext2”);

在您的情况下,这可能不是一个好的解决方案,但您可以为模型实体的每个实例创建两个单独的适配器类。这清楚地表明,对象是不同的。您可以很容易地从同一基类派生这两个类,从而使实现非常简单。

这很有意义。我会在几天后回来试一试,然后更新这篇文章。非常感谢!!!由于您不希望实例是默认的,因此语法应该是:For().Add(()=>…).Named(…);我尝试了以下方法,似乎有效:For().Use(()=>newObjectContextAdapter(newModel1Entities()).Named(“objectContext1”);(注意使用“use”而不是“Add”,我使用的是StructureMap 2.6.2.0)。
For<IObjectContext>().Add(() => new ObjectContextAdapter(new Model1Entities())).Named("objectContext1");
For<IObjectContext>().Add(() => new ObjectContextAdapter(new Model2Entities())).Named("objectContext2");