1

我正在设置一个应用程序,并使用 Unity 将一堆行为注入到服务中。有一个构造函数,例如:

public class WhateverService(IBehavior[] behaviors) : IService {}

所有这些都是在设置容器时设置的,例如:

container.RegisterType<IBehavior, LogBehavior>("LogBehavior");
container.RegisterType<IBehavior, SomeOtherBehavior>("SomeOtherBehavior");
container.RegisterType<IService, WhateverService>();

显然,注入是在 WCF 服务项目中完成的。

现在我想添加一个 MailNotificationBehavior。所以有一堆 SMTP 设置需要保存在某个地方。由于这个 SMTP 配置是一个部署的东西,我想使用默认的 web.config SMTP 设置配置。web.config 位于完成容器配置的同一个项目中,因此 MailNotificationBehavior 需要注入所有这些设置,或者只是 SmtpClient 的一个实例。

就像是:

container.RegisterType<IBehavior, MailNotificationBehavior>("MailNotificationBehavior", new new InjectionConstructor(new SmtpClient()));

问题是 - 我以后如何测试这个?我是否应该为实际的 SMTPClient 编写一个带有适配器的接口 ISmtpClient,这样我就可以伪造它,或者这是一个糟糕的设计?

4

1 回答 1

1

为什么在自动化测试中依赖注入?您可以/应该编写一个单元测试来实例化服务并使用模拟“行为”设置服务。

推理:您的单元测试应该隔离您要测试的行。使用注入使您的单元测试还可以测试注入是否有效以及在您的服务上下文中是否可以使用正确的行为。如果您为服务编写测试,您也不想要。

关于设计;虽然界面设计很好,但如果你从不打算切换具体的 smtp 库,那就是过度设计了。另一件有点味道的东西是创造“行为”。您的服务会做某事(对其周围环境等有影响),这就是它的行为。您的服务的行为是调用 IBehaviour 实现的方法,从而更改应用程序状态。

您真正想要做的是使用 AOP 通过将日志/电子邮件行为实现为方面来将它们添加到您的应用程序中。

于 2013-06-28T12:33:35.267 回答