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

Roo*_*ian 14 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们都知道在需要依赖时我们必须使用Constructor Injection.如果它是可选的依赖项,我们可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 16

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

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

  • +1赞成组合而不是继承.如果它成为一个构造函数参数太多的问题,那就归咎于你的继承策略,而不是构造函数注入. (5认同)