在基类中只需要依赖项时,在基类中使用Property Injection是否合适?

时间:2012-05-04 13:26:36

标签: c# dependency-injection inversion-of-control property-injection

示例:

public abstract class BaseControler : Controller
{
    public IUnitOfWork UnitOfWork { get; set; }
}

public class HomeController : BaseControler
{
    readonly IUserRepository _userRepository;

    // :-)
    public HomeController(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }
}

我们都知道,当依赖项需要时,我们必须使用构造函数注入 。如果它是可选依赖项,我们可以使用 Property Injection

但是当你的基类只需要依赖时你应该怎么做?

当您使用构造函数注入时,我认为您会污染所有派生类。

public abstract class BaseControler : Controller
{
    readonly IUnitOfWork _unitOfWork;

    public BaseControler(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
}

public class HomeController : BaseControler
{
    readonly IUserRepository _userRepository;

    // :-(
    public HomeController(IUserRepository userRepository, 
       IUnitOfWork unitOfWork) : base(unitOfWork)
    {
        _userRepository = userRepository;
    }
}

在基类中只需要依赖项时,在基类中使用 Property Injection 是否合适?

2 个答案:

答案 0 :(得分:15)

您没有污染派生类。您明确告诉消费者,如果没有此依赖关系,此类将无法运行。

如果基类需要此依赖项才能正常运行,因为派生类派生自此基类,它也隐式地需要此依赖项。所以第二个例子是正确的方法。您不应该对属于必需依赖项的内容使用属性注入。

答案 1 :(得分:3)

实际上你的派生类是一个基类。某处没有其他物体。当您将某些内容传递给基础构造函数时,实际上会初始化相同的对象。它向客户展示了您的实例所依赖的内容:

public HomeController(IUserRepository userRepository, IUnitOfWork unitOfWork)

有一个实例,它取决于两件事:用户存储库和工作单元。调用基类构造函数只是从派生类中删除初始化重复。