【发布时间】:2011-12-10 02:01:02
【问题描述】:
我们正在努力理解这两种配置 StructureMap 的方式之间的区别。我们的理解是它们应该是相同的,但是我们在 Initialize 中的这两行之间得到了不同的结果:
ObjectFactory.Initialize(x =>
{
x.For<IBusinessRelationsContext>().Use<BusinessRelationsContext>().Ctor<string>().Is(ConfigurationManager.ConnectionStrings["BusinessRelationsContext"].ConnectionString);
x.For<IBusinessRelationsContext>().Use(_ => new BusinessRelationsContext(ConfigurationManager.ConnectionStrings["BusinessRelationsContext"].ConnectionString));
});
(我们一次只使用两个中的一个 - 显然不是两个)
我们在这个对象上的各种构造函数签名(如果你关心的话,它是 EF4 的东西):
public BusinessRelationsContext();
public BusinessRelationsContext(string connectionString);
public BusinessRelationsContext(EntityConnection connection);
我们用来调用它的代码是:
ObjectFactory.TryGetInstance<IBusinessRelationsContext>();
我们看到的行为差异是包含 Ctor<string> 的行失败,因为 StructureMap 失败并显示 202“No Default Instance defined for PluginFamily System.Data.Common.DbConnection”(我们不知道它为什么会这样认为需要这个)。但是,如果我注释掉该行并使用另一行,它会像我们预期的那样完美运行。鉴于另一个有效,我怀疑我对 DbConnection 不需要配置的理解是正确的。
因此,与其追查为什么它需要 DbConnection,我宁愿追查我的问题的答案:这两者之间有什么区别?
【问题讨论】:
-
这有点重要,因为我们过去一直使用
.Ctor的方式来执行此操作(并且一直有效),但考虑到它开始失败(我们不确定为什么),我们需要更好地理解这一点。我们在这里在概念上遗漏了一些东西,我不想有一个定时炸弹...... -
我想我自己也亲眼见过这种情况,使用 Ctor 似乎不起作用。
-
我理解
Ctor的做法是否正确,基本上我说:“对于 IBusinessRelationsContext 实例,使用 BusinessRelationsContext 对象并调用Constructor 与 single string 参数并传入ConfigurationManager.ConnectionStrings["BusinessRelationsContext"].ConnectionString评估为该字符串参数”?还有什么别的吗? -
有趣的是,我们使用
Ctor方式与其他上下文对象一起使用!因为我们的数据库太大了,我们有大约 20 个不同的上下文,因为我们把它分成几个部分,它适用于所有 20 个部分。碰巧的是,在这些特定的单元测试中,这个特定的上下文失败了,而其他上下文使用Ctor方法可以正常工作。 (所有上下文都是从同一个模板生成的代码,所以没有区别!) -
这绝对是我对它的理解,我已经使用 SM 3 年多了。上次我想做这样的事情时,我很确定我最终不得不做类似于你在 Use 中手动更新对象所做的事情。
标签: c# .net-4.0 dependency-injection structuremap