現在、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)
{.....}
}
長所: ファクトリ クラスを必要とせずにコンストラクターを安全に使用できるようになりました。短所: 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)
{
}
}