简单案例: 我有一个用于记录消息的接口,如下所示:
public interface ILogger
{
void Log(string message);
}
也许有三个不同的类实现了这个接口。
现在,我可以在一个地方写一行,换行,就像:
kernel.Bind<ILogger>().To<ConsoleLogger>();
我的问题是,如何在许多类中使用该接口,但不通过构造函数注入所有人。因为我们可以使用这么多不同的接口,并且该类构造函数的声明可能很混乱。
答案 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容器支持的属性注入功能。