StructureMap 构造函数参数应用于属性

StructureMap constructor arguments are applied to properties

我正在使用 StructureMap 注册一个 class,它在构造函数参数中包含一个 TimeSpan,另一个 TimeSpan 作为 class 的 属性。当我在 StructureMap 中使用命名构造函数参数时,构造函数参数的值将应用于我的构造函数参数和任何 public class 属性,它们是 TimeSpans。我还尝试将 class 切换为 DateTimes 而不是 TimeSpans 并得到相同的结果。所以我的问题是,我是在正确使用 StructureMap 还是应该以其他方式注册此 class?谢谢!

下面是一个简单的界面和class来演示问题:

public interface ITimeSpanTest
{
  TimeSpan Timeout { get; set; }
  TimeSpan LogTimeout { get; set; }
}

public class TimeSpanTest : ITimeSpanTest
{
  public TimeSpan LogTimeout { get; set; }
  public TimeSpan Timeout { get; set; }

  public string Process { get; set; }

  public TimeSpanTest(TimeSpan logTimeout, string process)
  {
    this.Timeout = TimeSpan.FromSeconds(1);
    this.LogTimeout = logTimeout;
    this.Process = process;
  }
}

这是StructureMap注册码

Container container = new Container();

container.Configure(c =>
{
  c.Scan(x =>
  {
    x.TheCallingAssembly();
  });

  c.For<ITimeSpanTest>().Use<TimeSpanTest>()
    .Ctor<TimeSpan>("logTimeout").Is(TimeSpan.FromMinutes(5))
    .Ctor<string>("process").Is("Process")
    .Singleton();
});

这是 StructureMap 的 container.Model.For().Default.DescribeBuildPlan() 函数的输出

PluginType: SMTest.ITimeSpanTest
Lifecycle: Singleton
new TimeSpanTest(TimeSpan, String process)
  ? TimeSpan = Value: 00:05:00
  ? String process = Value: Process
Set TimeSpan LogTimeout = Value: 00:05:00
Set TimeSpan Timeout = Value: 00:05:00

如您所见,似乎忽略了 TimeSpan 构造函数参数的 "logTimeout" 名称。超时 属性 被设置为 00:05:00,而它应该是 00:00:01。我正在使用 StructureMap 3.1.6.186.

我在这里没有得到答案,但我发帖到 StructureMap Google 组。 Jeremy Miller 的回答在

https://groups.google.com/forum/#!topic/structuremap-users/4wA737fnRdw

基本上,这是一个已知问题,可能不会得到解决,因为将超时设置为只读很容易解决。这可以通过删除超时 属性 中的设置来完成。例如,

public interface ITimeSpanTest
{
  TimeSpan Timeout { get; }
  TimeSpan LogTimeout { get; set; }
}

public class TimeSpanTest : ITimeSpanTest
{
  public TimeSpan LogTimeout { get; set; }
  public TimeSpan Timeout { get; }

  public string Process { get; set; }

  public TimeSpanTest(TimeSpan logTimeout, string process)
  {
    this.Timeout = TimeSpan.FromSeconds(1);
    this.LogTimeout = logTimeout;
    this.Process = process;
  }
}

在这种特殊情况下效果很好。最终,这个问题似乎是 StructureMap setter 注入器将 logTimeout 设置应用于所有 public TimeSpan 属性。我还使用表现出相同行为的 DateTime 进行了测试。但是,float 和 int 类型没有。 StructureMap 3的最后几个版本和4的最新版本都会出现这种情况。