我正在使用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。
答案 0 :(得分:2)
我在这里没有得到答案,但是我发布了StructureMap Google Group。杰里米·米勒的回答是
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中。