C# 容器未在构造函数中设置属性
我创建了一个服务。我使用Funq进行依赖注入,因为默认情况下它与ServiceStack一起提供,但这可能是其他DI容器所表现的行为 我在启动时注册我的类型:C# 容器未在构造函数中设置属性,c#,dependency-injection,
servicestack,funq,C#,Dependency Injection,
servicestack,Funq,我创建了一个服务。我使用Funq进行依赖注入,因为默认情况下它与ServiceStack一起提供,但这可能是其他DI容器所表现的行为 我在启动时注册我的类型: this.AppContainer.RegisterAs<ConcreteDownloadServices, IDownloadServices>();` 我的具体实现的构建者是: public ConcreteDownloadServices() { this.ArbitraryProperty = "Arbitr
this.AppContainer.RegisterAs<ConcreteDownloadServices, IDownloadServices>();`
我的具体实现的构建者是:
public ConcreteDownloadServices()
{
this.ArbitraryProperty = "ArbitraryString";
}
一切都解决得很好,我可以进入代码,看到事情按预期进行。但是,abritaryProperty
未正确设置。我可以单步执行并看到它被设置为字符串值,但是一旦代码返回到调用代码(在本例中,它将是ExampleService
)的构造函数,ArbitraryProperty
现在为空
编辑: 我已经决定这永远都不是我想要的行为,所以我只需要强制Funq不会自动连接字符串(和ValueType)属性。新行为将在下一版本的ServiceStack(v3.9.34)中提供 存在行为 RegisterAs是一种自动连接的API,即:
Container.RegisterAs<ConcreteDownloadServices, IDownloadServices>();
因为您没有注册任何“字符串”,所以将使用null
覆盖该属性。只有公共属性是自动连接的,因此您可以通过将其更改为受保护、私有或内部属性来避免这种行为
否则,您可以通过注册自定义代理工厂来覆盖默认的IOC行为,该工厂使您能够完全控制依赖项的构造,例如:
container.Register<IDownloadServices>(c => new ConcreteDownloadServices());
container.Register(c=>newconcretedownloadservices());
编辑:
我已经决定这永远都不是我想要的行为,所以我只需要强制Funq不会自动连接字符串(和ValueType)属性。新行为将在下一版本的ServiceStack(v3.9.34)中提供
存在行为
RegisterAs是一种自动连接的API,即:
Container.RegisterAs<ConcreteDownloadServices, IDownloadServices>();
因为您没有注册任何“字符串”,所以将使用null
覆盖该属性。只有公共属性是自动连接的,因此您可以通过将其更改为受保护、私有或内部属性来避免这种行为
否则,您可以通过注册自定义代理工厂来覆盖默认的IOC行为,该工厂使您能够完全控制依赖项的构造,例如:
container.Register<IDownloadServices>(c => new ConcreteDownloadServices());
container.Register(c=>newconcretedownloadservices());
我们开发团队的一些成员刚刚花了一些时间调试了一个类似的问题
在我们的一个单元测试中使用的RegisterAs类有一个公共成员:
公共列表邮件{get;set;}
当这个类通过Funq解析时,成员被设置为null,即使它是在构造函数中设置的
我们的团队成员同意,当该成员不是注册为Container.RegisterAs的类型时,Funq将该成员设置为null是明智的
我们正在使用ServiceStack 4.0.33版我们开发团队的一些成员刚刚花了一些时间调试了一个类似的问题 在我们的一个单元测试中使用的RegisterAs类有一个公共成员: 公共列表邮件{get;set;} 当这个类通过Funq解析时,成员被设置为null,即使它是在构造函数中设置的 我们的团队成员同意,当该成员不是注册为Container.RegisterAs的类型时,Funq将该成员设置为null是明智的
我们正在使用ServiceStack 4.0.33版惊人的信息,感谢mythz:)更改属性修饰符是不可行的,因为它实现了一个接口,因此必须是一个公共属性。在代理工厂中使用Register看起来就是答案。然而,这是否表明如果我想使用RegisterAs或其他自动连接API,我不应该使用值类型属性?对于我的特定场景,在接口中有一些东西来强制实现这个字符串对我来说是有意义的,但我只能使用公共属性(我想!)。打算添加-我想我需要创建一个包含依赖字符串的接口和具体实现,并将其注入到RegisterAs中?@thudbutt认为这不是理想的行为,因此Funq将不再尝试在周末发布到NuGet的下一版本ServiceStack中解析字符串属性。令人惊讶的信息,感谢mythz:)更改属性修饰符是错误的,因为它实现了一个接口,所以必须是公共属性。在代理工厂中使用Register看起来就是答案。然而,这是否表明如果我想使用RegisterAs或其他自动连接API,我不应该使用值类型属性?对于我的特定场景,在接口中有一些东西来强制实现这个字符串对我来说是有意义的,但我只能使用公共属性(我想!)。打算添加-我想我需要创建一个包含依赖字符串的接口和具体实现,并将其注入到RegisterAs中?@thudbutt认为这不是理想的行为,因此Funq将不再尝试在周末发布到NuGet的下一版本ServiceStack中解析字符串属性。