我们正在努力理解这两种配置 StructureMap 的方法之间的差异。我们的理解是它们应该是相同的,但是我们在初始化的这两行之间得到不同的结果:
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“没有为 PluginFamily System.Data.Common.DbConnection 定义默认实例”(我们不知道为什么它认为需要这个)。然而,如果我评论该行并使用另一行,它就会像我们预期的那样完美地工作。鉴于另一个可以工作,我怀疑我认为它不需要 DbConnection 配置的理解是正确的。
因此,与其追查为什么需要 DbConnection,我宁愿追查问题的答案:这两者之间有什么区别?
最佳答案
我认为 StructureMap 正在选择最复杂的构造函数来尝试创建数据上下文。您在 Ctor 调用中定义的是如何使用不太复杂的构造函数来定义该类的定义。
所以你的定义不正确,只是 StructureMap 没有调用你认为它应该调用的构造函数。
注意:我通常使用您的第二个调用,因为我知道将调用哪个构造函数,即使您必须添加新的构造函数用于测试或其他目的。
x.For<IBusinessRelationsContext>().Use(_ => new BusinessRelationsContext(ConfigurationManager.ConnectionStrings["BusinessRelationsContext"].ConnectionString));
关于c# - 这两个 StructureMap 配置有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449455/