现在,我们使用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);
}
}
现在,这个问题是我们最终建立一个整体洛塔工厂类,人们总是不知道使用它们(他们有时新起来自理)。 什么是编码这样的类的最大劣势:
public class EmailSender
{
EmailLogger logger = IoC.Resolve<ILogger>();
internal EmailSender(string toEmail, string subject,String body)
{.....}
}
临:我们现在可以放心地使用构造而无需工厂类缺点:我们引用了服务定位器(我不担心可测试性,其易于使用的一个模拟的容器作为容器支撑服务)。
是否有一个原因,一些大臭气熏天在那里,为什么我们不应该这样做?
编辑:有点想法之后,我突然意识到当具有私有构造函数,通过嵌套工厂类的,我可以继续实施和工厂一起,并阻止人们创造不当班,所以这个问题已经变得有些没有实际意义。 所有关于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)
{
}
}