c# – StructureMap构造函数参数应用于属性

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

以下是一个简单的接口和类来演示问题:

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”名称似乎被忽略. Timeout属性设置为00:05:00,应该是00:00:01.我正在使用StructureMap 3.1.6.186.

最佳答案 我没有在这里得到答案,但我发布了StructureMap Google Group. Jeremy Miller的回答是

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

基本上,这是一个已知的问题,可能不会修复,因为通过使Timeout只读是很容易解决的.这可以通过删除Timeout属性中的集来完成.例如,

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设置应用于所有公共TimeSpan属性.我还测试了DateTime,它表现出相同的行为.但是,float和int类型不会.这发生在StructureMap 3的最后几个版本和最新版本的4中.

点赞