使用属性注入与受保护的属性getter

时间:2012-10-12 04:13:49

标签: c# dependency-injection

通过依赖注入设置属性(在这种情况下是一个日志记录依赖)是否正常使得getter受到保护,以便依赖对象之外的对象不能调用该属性?

public ILogger Logger { protected get; set; }

VS

public ILogger Logger { get; set; }

(我实际上在这些中使用null object pattern,但这不是重点。)

我不想使用构造函数注入,但是通过公共属性注入,对于任何其他对象来说,调用此对象的记录器并不“正确”。

所以上面是我的目标,但它确实看起来很奇怪。

3 个答案:

答案 0 :(得分:1)

为什么你需要记录器的吸气剂?

您注入的对象应该是它们被注入的对象的实现细节。所以一般来说,你应该为这些项目设置一个setter。

答案 1 :(得分:1)

你有公共吸气剂并不重要。您的实现应该实现一个接口,消费者应该依赖于接口,而不是实现。由于您的Logger属性是在实现上定义的,因此消费者无权访问它。因此,同时使用公共getter和setter都没有问题。

但是,由于您已经在讨论Null对象模式,我假设始终注入了记录器。在那种情况下,为什么不简单地使用构造函数注入?属性可用于可选的依赖项,但由于使用了Null Object模式,因此几乎没有理由定义属性。如果您发现自己定义了一个属性,因为您希望此日志记录依赖项可用于多种类型,请自问:Aren't I logging too much?

答案 2 :(得分:0)

通常,getter方法被标记为public(尽管有些纯粹主义者也会避免使用getter并在对象上公开定义明确的操作作为方法)并且setter方法要么被避免,要么被标记为protected / private,因为DI框架是在使用no-arg默认构造函数构造对象后,能够在对象上设置值。 DI框架能够使用反射访问受保护/私有方法,因此也不会解决不暴露s​​etter的目的。