【问题标题】:Is it appropriate to use Property Injection in a base class when a dependency is only required in the base class?当只在基类中需要依赖时,是否适合在基类中使用属​​性注入?
【发布时间】:2012-05-04 13:26:35
【问题描述】:

例子:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我明白你的意思,但我会遇到的问题是很多构造函数参数。关键是派生类不直接与依赖项对话,而是与基类对话。所以我会区分对依赖项的直接调用和对依赖项的间接调用。
    • @Rookian,如果您遇到有多个构造函数参数的情况,您可能会考虑创建一个服务来聚合这些依赖项,然后只将服务注入构造函数。
    • +1 优先组合而不是继承。如果构造函数参数过多而成为问题,请归咎于您的继承策略,而不是构造函数注入。
    • @Rookian,看我的回答 - 派生类正在与依赖项对话,因为它也是基类。您只是将所有重复的逻辑(使用依赖项)推送到基类。
    【解决方案2】:

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

    public HomeController(IUserRepository userRepository, IUnitOfWork unitOfWork)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2011-09-07
      相关资源
      最近更新 更多