这两个StructureMap配置之间的区别是什么?

本文关键字:之间 区别 是什么 配置 StructureMap 两个 | 更新日期: 2023-09-27 18:17:27

我们正在努力理解这两种配置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 for PluginFamily System.Data.Common "。(我们不知道为什么它认为它需要这个)。但是,如果我注释掉这一行并使用另一行,它就会像我们期望的那样完美地工作。考虑到另一个工作,我怀疑我的理解,它不应该需要配置DbConnection是正确的。

所以与其追踪为什么它需要DbConnection,我更愿意追踪我的问题的答案:这两者之间的区别是什么?

这两个StructureMap配置之间的区别是什么?

我认为StructureMap正在选择最复杂的构造函数来尝试创建您的数据上下文。你在上面的函数调用中定义的是一个关于如何使用一个不那么复杂的构造函数来定义那个类的定义。

所以你的定义不是不正确的,只是StructureMap没有调用你认为它应该调用的构造函数。

注意:我通常使用您的第二个调用,因为我知道将调用哪个构造函数,即使您必须为测试或其他目的添加新的构造函数

x.For<IBusinessRelationsContext>().Use(_ => new BusinessRelationsContext(ConfigurationManager.ConnectionStrings["BusinessRelationsContext"].ConnectionString));

所以我让离线的人帮我做这个(没想到我有任何离线的资源!)问题是,正如Khalid Abuhakmeh解释的那样-它选择了最复杂的一个("最贪婪的"-在这里阅读更多)。

既然我们知道了问题,我们就可以寻找解决方案了。在我的情况下(以及在这里评论的情况下),解决方案是添加一行,如下所示:

x.SelectConstructor<IBusinessRelationsContext>(() => new BusinessRelationsContext(""));