这两个StructureMap配置有什么区别?

时间:2011-12-09 17:35:32

标签: c# .net-4.0 dependency-injection structuremap

我们正在努力理解这两种配置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我宁愿追查我的问题的答案:这两者之间有什么区别?

2 个答案:

答案 0 :(得分:3)

我认为StructureMap正在选择最复杂的构造函数来尝试创建datacontext。您在Ctor调用中定义的内容是关于如何使用不太复杂的构造函数定义该类的定义。

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

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

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

答案 1 :(得分:0)

所以我有人离线帮助我(不认为我有任何离线资源!)问题就像Khalid Abuhakmeh解释的那样 - 它选择了最复杂的一个(“最贪婪的” - { {3}})。

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

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