当基类中只需要依赖项时,是否适合在基类中使用属性注入

本文关键字:基类 属性 注入 是否 依赖 | 更新日期: 2023-09-27 18:33:16

示例:

public abstract class BaseControler : Controller
{
    public IUnitOfWork UnitOfWork { get; set; }
}
public class HomeController : BaseControler
{
    readonly IUserRepository _userRepository;
    // :-)
    public HomeController(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }
}

我们都知道,当需要依赖关系时,我们必须使用构造函数注入。如果它是一个可选的依赖项,我们可以改用属性注入

但是,当只有基类需要依赖项时,您应该怎么做?

当你使用构造函数注入时,在我看来你会污染所有派生类。

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;
    }
}
当基类

中只需要依赖项时,在基类中使用属性注入是否合适?

当基类中只需要依赖项时,是否适合在基类中使用属性注入

您没有污染派生类。您向使用者显式声明,如果没有此依赖项,此类将无法运行。

如果基类需要此

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

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

public HomeController(IUserRepository userRepository, IUnitOfWork unitOfWork)

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