gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:23:58 27 4
gpt4 key购买 nike

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

下面是一个简单的接口(interface)和类来演示这个问题:

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 注入(inject)器将 logTimeout 设置应用于所有公共(public) TimeSpan 属性。我还使用表现出相同行为的 DateTime 进行了测试。但是,float 和 int 类型没有。 StructureMap 3 的最后几个版本和 4 的最新版本都会出现这种情况。

关于c# - StructureMap 构造函数参数应用于属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35206643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com