今日、私はこのクラスを持っている:依存性注入 - ロジックをオーバーロードされたコンストラクタに配置しますか?
public class SmtpEmailProvider : IMessageProvider
{
private readonly SmtpClientWrapper _smtpClientWrapper;
public SmtpEmailProvider(SmtpClientWrapper smtpClientWrapper)
{
_smtpClientWrapper = smtpClientWrapper;
}
はSmtpClientを模擬できるようにするために、私はこのようにそれを包みました:
public class SmtpClientWrapper
{
private readonly SmtpClient _smtpClient;
public SmtpClientWrapper(SmtpClient smtpClient)
{
_smtpClient = smtpClient;
}
public virtual void Send(MailMessage msg)
{
if (_smtpClient == null) throw new InvalidOperationException("SmtpClient must be passed to the constructor before calling Send.");
_smtpClient.Send(msg);
}
}
今私はSmtpEmailProviderを開始するには、これを行うことができますクラス、およびそこSmtpClientロジックを配置します。
public IMessageProvider LocateProviderByName(string providerName)
{
var client = new SmtpClient
{
Host = "127.0.0.1",
Port = 25
};
client.Credentials = new NetworkCredential("...", "...");
return new SmtpEmailProvider(new SmtpClientWrapper(client));
}
をしかし、私はそれを交換したい:
public IMessageProvider LocateProviderByName(string providerName)
{
return IoC.Resolve<IMessageProvider>(providerName);
}
次に、ロジックをパラメータなしでコンストラクタに配置する必要があります。しかし、私はその時、コンストラクターでずっとやっているような気持ちになります。
他の方法はありますか?
+ 1私に物事を行う方法の新しいアイデアを与えるため。 しかし、論理にはIoCで指定できるものだけではないと言えます。同様に、私はいくつかのパラメータに応じて、他の設定リポジトリからホスト/ポートをフェッチできる必要があります。 ロジックを配置する正しい場所はどこですか? – Allrameest
この種の機能が必要な場合は、必要なもののインスタンスではなく、注入可能な別のプロバイダまたはファクトリを作成します。たとえば、SmtpClientにホスト、ポート、および資格情報を動的に割り当てる必要があるようです。 SmtpClientFactoryを作成してSmtpClientWrapperに注入します。 SmtpClientWrapperは内部的にSmtpClientの内部インスタンスを作成し、必要に応じてキャッシュすることができます.Mockabilityを維持するために重要なのは、SmtpClientFactoryに仮想メソッドがあることを確認することです。 – jrista
私が気にしていたことが工場でした。私はそれに行くよ! :) – Allrameest