gpt4 book ai didi

c# - 这两个 StructureMap 配置之间有什么区别?

转载 作者:行者123 更新时间:2023-11-30 22:33:08 36 4
gpt4 key购买 nike

我们正在努力理解这两种配置 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“没有为 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com