15

例子:

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;
    }
}

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

4

2 回答 2

16

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

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

于 2012-05-04T13:29:31.580 回答
3

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

public HomeController(IUserRepository userRepository, IUnitOfWork unitOfWork)

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

于 2012-05-04T13:39:57.983 回答