简单案例:我有一个用于记录消息的接口,如下所示:
public interface ILogger
{
void Log(string message);
}
也许三个不同的类实现了这个接口。
现在,我可以在一个地方写下 DI 行,例如:
kernel.Bind<ILogger>().To<ConsoleLogger>();
我的问题是,如何在许多类中使用该接口,但不通过构造函数注入每个人。因为我们可以有很多我们想要使用的不同接口,并且在该类构造函数上的声明可能会很混乱。
简单案例:我有一个用于记录消息的接口,如下所示:
public interface ILogger
{
void Log(string message);
}
也许三个不同的类实现了这个接口。
现在,我可以在一个地方写下 DI 行,例如:
kernel.Bind<ILogger>().To<ConsoleLogger>();
我的问题是,如何在许多类中使用该接口,但不通过构造函数注入每个人。因为我们可以有很多我们想要使用的不同接口,并且在该类构造函数上的声明可能会很混乱。
在构造函数中注入过多的项目是一种代码异味。这通常意味着您的班级正在扮演多个角色。单一职责原则说每个类应该只有一个目的,它完全封装在类中。
在依赖注入中,在遗留场景之外使用属性注入被认为是糟糕的形式。通过属性注入一个值表明它是可选的,因此并不是真正的依赖。
如果您的类型具有大量构造函数依赖项,则可能表明您需要进行一些重构。也许某些类型可以一起使用,并且可以重构为它们自己的组件。无论哪种方式,如果您使用的是 IoC 框架(例如 Ninject),那么一个类型需要多少个构造函数参数真的很重要吗?无论如何,容器将为您进行注射。
虽然@LukeMcGregor 所说的一般来说是正确的,但 Logger 看起来像是一个横切关注点,如果您不想用 ILogger 污染每个构造函数,也可以通过AOP解决。Ninject 似乎通过ninject.extensions.interception支持 AOP 。
您可以ILogger Logger { get; set;}在类中实现属性并使用大多数 IoC 容器支持的属性注入功能。