现在我们使用 DI/IOC,当我们需要向构造函数传递额外的参数时,我们使用工厂类,例如
public class EmailSender
{
internal EmailSender(string toEmail, string subject,String body, ILogger emailLogger)
{.....}
}
public class EmailSenderFactory
{
ILogger emailLogger;
public EmailSenderFactory(ILogger emailLogger)
{
this.emailLogger = emailLogger;
}
public EmailSender Create(string toEmail, string subject, string body)
{
return new EmailSender(toEmail, subject, body, emailLogger);
}
}
现在的问题是我们最终创建了一个完整的lotta工厂类,人们并不总是知道使用它们(他们有时会自己新建它们)。像这样对类进行编码的最大缺点是什么:
public class EmailSender
{
EmailLogger logger = IoC.Resolve<ILogger>();
internal EmailSender(string toEmail, string subject,String body)
{.....}
}
Pro:我们现在可以安全地使用构造函数,而不需要工厂类 Con:我们必须引用 Service Locator(我不担心可测试性,它很容易使用模拟容器作为容器的支持服务)。
为什么我们不应该这样做?
编辑:经过一番思考,我认为通过拥有一个私有构造函数,并通过嵌套 Factory 类,我可以将实现和工厂保持在一起,并防止人们不正确地创建类,所以这个问题变得有些没有实际意义。所有关于 SL 脏的观点当然都是正确的,所以下面的解决方案让我很高兴:
public class EmailSender
{
public class Factory
{
ILogger emailLogger;
public Factory(ILogger emailLogger)
{
this.emailLogger = emailLogger;
}
public EmailSender Create(string toEmail, string subject, string body)
{
return new EmailSender(toEmail, subject, body, emailLogger);
}
}
private EmailSender(string toEmail, string subject,String body, ILogger emailLogger)
{
}
}