Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 容器未在构造函数中设置属性_C#_Dependency Injection_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Funq - Fatal编程技术网 servicestack,funq,C#,Dependency Injection,servicestack,Funq" /> servicestack,funq,C#,Dependency Injection,servicestack,Funq" />

C# 容器未在构造函数中设置属性

C# 容器未在构造函数中设置属性,c#,dependency-injection,servicestack,funq,C#,Dependency Injection,servicestack,Funq,我创建了一个服务。我使用Funq进行依赖注入,因为默认情况下它与ServiceStack一起提供,但这可能是其他DI容器所表现的行为 我在启动时注册我的类型: this.AppContainer.RegisterAs<ConcreteDownloadServices, IDownloadServices>();` 我的具体实现的构建者是: public ConcreteDownloadServices() { this.ArbitraryProperty = "Arbitr

我创建了一个服务。我使用Funq进行依赖注入,因为默认情况下它与ServiceStack一起提供,但这可能是其他DI容器所表现的行为

我在启动时注册我的类型:

this.AppContainer.RegisterAs<ConcreteDownloadServices, IDownloadServices>();`
我的具体实现的构建者是:

public ConcreteDownloadServices()
{
    this.ArbitraryProperty = "ArbitraryString";
}
一切都解决得很好,我可以进入代码,看到事情按预期进行。但是,
abritaryProperty
未正确设置。我可以单步执行并看到它被设置为字符串值,但是一旦代码返回到调用代码(在本例中,它将是
ExampleService
)的构造函数,
ArbitraryProperty
现在为空

  • 这种行为是故意的吗
  • 如果是设计,那么使用DI是否意味着我不应该在具体实现的构造函数中做任何事情
  • 如果是设计的,那么为自动特性设置默认值的正确方法是什么
  • 如果不是故意的,那是怎么回事

  • 编辑:

    我已经决定这永远都不是我想要的行为,所以我只需要强制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中解析字符串属性。