C# 通过属性注入依赖项的正确方法

C# 通过属性注入依赖项的正确方法,c#,dependency-injection,C#,Dependency Injection,我正在写一些代码,有人告诉我其中有一个潜在的bug。我们的建筑师解释了原因,但我还是不明白。在我看来,即使在他的纠正之后,它也在做同样的工作。有人能向我解释最初的错误吗 根据我们的架构师,它应该是什么样子: private IIzuProxyService _izuProxyService = null; private IIzuProxyService IzuProxyService { get { if (_i

我正在写一些代码,有人告诉我其中有一个潜在的bug。我们的建筑师解释了原因,但我还是不明白。在我看来,即使在他的纠正之后,它也在做同样的工作。有人能向我解释最初的错误吗

根据我们的架构师,它应该是什么样子:

    private IIzuProxyService _izuProxyService = null;

    private IIzuProxyService IzuProxyService
    {
        get
        {
            if (_izuProxyService == null)
                _izuProxyService = new IzuProxyService();
            return _izuProxyService;
        }
    }
它最初的样子:

    private IIzuProxyService _izuProxyService = null;

    private IIzuProxyService IzuProxyService
    {
        get
        {
            if (_izuProxyService == null)
                return new IzuProxyService();
            return _izuProxyService;
        }
    }

非常感谢

您的代码从不分配给
\u izurouxyservice
字段


这意味着每当访问
izupxyservice
属性时,
\u izupxyservice
总是
null
。因此,它将始终实例化一个新实例。

本地字段从未被赋值,并且将保持空值,因为属性getter每次都返回一个新实例,而不给本地字段赋值

一种解决方法可以用来管理所需字段的延迟加载

提供对延迟初始化的支持


原始实例将始终返回一个新实例。注意,这里没有注入。在这种情况下,调试器是您的朋友。在旧代码中的
返回新的
行上放置断点。运行它(以便它调用getter两次)。看看会发生什么。然后换成新代码,做同样的事情。你马上就能发现这个虫子。
private Lazy<IIzuProxyService> _izuProxyService = new Lazy<IIzuProxyService>(() => new IzuProxyService() );

private IIzuProxyService IzuProxyService {
    get {
        return _izuProxyService.Value;
    }
}
if (_izuProxyService == null)
    _izuProxyService = new IzuProxyService();
return _izuProxyService;