【发布时间】:2015-08-26 08:35:22
【问题描述】:
我正在设计一个使用抽象属性来提供对字段的访问点的类。这是我的代码的 sn-p:
public abstract class PageBroker : WebBroker
{
public abstract IPageProvider Provider { get; }
}
public class ArticleBroker : PageBroker
{
public override IPageProvider Provider { get; } = new ArticleProvider();
}
我意识到我可以将其重构为使用 DI,如下所示:
public class PageBroker : WebBroker
{
public PageBroker(IPageProvider provider)
{
this.Provider = provider;
}
public IPageProvider Provider { get; private set; }
// implementation...
}
// no derived class, just new PageBroker(new ArticleProvider())
在什么情况下,一种技术比另一种更合适?
【问题讨论】:
-
当类到函数属性的值必需时,应使用构造函数注入。当注入一个值是可选的(例如,有一个默认值或客户端的特定用途不需要该属性)时,应该使用属性注入。
-
@DStanley 对不起,这根本不是我的问题。我在问我是否应该创建属性
abstract以便派生类可以实现它,或者通过构造函数将其传递。这与 setter 注入无关。 -
好吧,构造函数不是继承的,所以派生类必须以任何一种方式“覆盖”某些东西。所以我不确定你在寻找什么区别(除了 setter 和构造函数注入)。
-
@DStanley 谢谢,更新问题澄清。 (没有带有 DI 的派生类。)
-
就个人而言,我会使用第二个,因为我可以使用外部资源来提供我的
IPageProvider(几乎是 DI 的定义)。第一个的用途是,如果我有另一个理由证明ArticleBroker需要与PageBroker不同/继承。
标签: c# dependency-injection abstract-class