3

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

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

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

现在,我可以在一个地方写下 DI 行,例如:

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

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

4

4 回答 4

5

在构造函数中注入过多的项目是一种代码异味。这通常意味着您的班级正在扮演多个角色。单一职责原则说每个类应该只有一个目的,它完全封装在类中。

于 2012-05-21T00:46:07.357 回答
2

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

如果您的类型具有大量构造函数依赖项,则可能表明您需要进行一些重构。也许某些类型可以一起使用,并且可以重构为它们自己的组件。无论哪种方式,如果您使用的是 IoC 框架(例如 Ninject),那么一个类型需要多少个构造函数参数真的很重要吗?无论如何,容器将为您进行注射。

于 2012-05-21T00:11:28.037 回答
1

虽然@LukeMcGregor 所说的一般来说是正确的,但 Logger 看起来像是一个横切关注点,如果您不想用 ILogger 污染每个构造函数,也可以通过AOP解决。Ninject 似乎通过ninject.extensions.interception支持 AOP 。

于 2012-05-21T07:03:38.573 回答
0

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

于 2012-05-21T00:03:38.577 回答