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

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

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

相关文章:

c# - 使用 .NET/C# 从 Google Analytics API 检索数据

.net-4.0 - 好的 .net4 分析器

wpf - 如何在 PowerShell ISE 中使用 WPF DataGrid (.Net 4.0)?

c# - 将异步编程模型(开始/结束方法)转换为基于事件的异步模型?

c# - 没有互联网连接的iOS应用崩溃

c# - Facebook C# SDK 文档和示例在哪里?

c# - 过滤以 `datagridview` 为界的 `datatable` 范围内的数据

http - 如何在不使用构造函数 DI 的情况下创建 Http 实例?

python - 关于FastAPI的依赖注入(inject)及其可重用性的问题

java - 使用运行时数据的依赖注入(inject) : Factories and direct dependencies