如何正确使用依赖注入?

时间:2012-05-20 23:56:22

标签: c# oop dependency-injection ninject

简单案例: 我有一个用于记录消息的接口,如下所示:

public interface ILogger
{
   void Log(string message);
}

也许有三个不同的类实现了这个接口。

现在,我可以在一个地方写一行,换行,就像:

kernel.Bind<ILogger>().To<ConsoleLogger>();

我的问题是,如何在许多类中使用该接口,但不通过构造函数注入所有人。因为我们可以使用这么多不同的接口,并且该类构造函数的声明可能很混乱。

4 个答案:

答案 0 :(得分:5)

构造函数中有太多注入的项目是代码味道。这通常意味着您的班级不仅仅扮演一个角色。 single responsiblity principle表示每个类应该只有一个目的,它完全封装在类中。

答案 1 :(得分:2)

在依赖注入中,在遗留场景之外使用属性注入被认为是不良形式。通过属性注入值表明它是可选的,因此不是真正的依赖。

如果你的类型有很多很多的构造函数依赖,那么可能会建议你需要进行一些重构。也许某些类型一起使用,可以重构为自己的组件。无论哪种方式,如果您使用的是像Ninject这样的IoC框架,那么类型需要多少构造函数参数才真正重要?无论如何,容器都会为您注射。

答案 2 :(得分:1)

虽然@LukeMcGregor说它一般都是真的,但Logger看起来像是一个跨领域的问题,如果你不想用ILogger污染每个构造函数,也可以通过AOP来解决。 Ninject似乎通过ninject.extensions.interception支持AOP。

答案 3 :(得分:0)

您可以在类中实现ILogger Logger { get; set;}属性,并使用大多数IoC容器支持的属性注入功能。