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的最新版本都会出现这种情况。
我正在使用 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的最新版本都会出现这种情况。