[依赖注入-何时使用属性注入

问题描述 投票:9回答:2

我有一个具有这样的构造函数的类:

    private string _someString;
    private ObjectA _objectA;
    private ObjectB _objectB;
    private Dictionary<Enum, long?> _dictionaryA;
    private Dictionary<Tuple<Enum,long?>, long?> _dictionaryB; 

    public SomeDiClass(string someString)
    {
        _someString = someString;

        _objectA = new ObjectA();
        _objectB = new ObjectB();

        _dictionaryA = new Dictionary<Enum, long?>();
        _dictionaryB = new Dictionary<Tuple<Enum, long?>, long?>();
    }

我想从此构造函数中创建依赖项。第一步,我将ObjectA和B依赖项移至构造函数参数,以通过构造函数注入将它们注入。我想为此使用IoC容器,这就是我目前停留的位置。问题是如何使用someString和字典。我需要将它们注入到类中,因为字典的内容将是单元测试的重要组成部分。通过属性注入来注入字符串和字典是否是一个好主意(我在其他类中不需要它们),所以我最终会得到这样的结果::

    private ObjectA _objectA;
    private ObjectB _objectB;

    public string SomeString { get; set; }
    public Dictionary<Enum, long?> DictionaryA { get; set; }
    public Dictionary<Tuple<Enum, long?>, long?> DictionaryB { get; set; }

    public SomeDiClass(ObjectA objectA, ObjectB objectB)
    {
        _objectA = objectA;
        _objectB = objectB;
    }

是否有解决此类问题的最佳实践?

c# dependency-injection ioc-container
2个回答
22
投票

依赖关系注入不是最终目标,而是对一系列特定问题的解决方案。例如,依赖注入使您可以轻松地替换抽象以进行单元测试,并使您的应用程序更加灵活,因为您可以交换,修饰和拦截依赖,而无需更改使用类。您可以在本书chapter 1(DIPP&P)的此免费提供的Dependency Injection Principles, Practices, and Patterns中找到有关依赖注入的良好介绍。

这并不意味着您应该注入类具有的[[every


4
投票
如果无法创建类型的对象,则应使用属性注入(或setter注入)。像aspx Page,HttpHandler,ApiController等。对于所有其他情况,建议使用构造函数注入。
© www.soinside.com 2019 - 2024. All rights reserved.