0

クラスの正しい動作と動作に本当に必要な依存関係を管理するときに、コンストラクターの注入を適用する必要があることを私は知っています。

それでも、この例を公開したいと思います。MailServer クラスを仮定しましょう:

public class MailServer : IMailServer
{
    public MailServer(ServerData serverData)
    {
        _serverData = serverData;
    }

    public void SendMail(MailData mailData)
    {
        //Work with mailData instance and send mail
        ...
        smtp.Send(mail);
    }
}

ServerData には、メールの送信方法を知るために必要な情報が含まれています。たとえば、サーバー IP アドレス、FROM ソース アドレス、FROM パスワードなどです。MailData には、必要な本文とメールの送信先アドレスが含まれています。

どちらも必須の依存関係です。これは私を悩ませ、解決方法がわからないのは、アプリケーションのさまざまな場所で ServerData が異なる可能性があることです。IMailServer がインボイス システムで使用されている場合、メールは「invoices@domain.com」から送信されているはずですが、他の領域で使用されている場合は、「notifications@domain.com」から送信されている必要があります。

これを管理する正しい方法が何であるかわかりません。依存性注入に関連するすべてに関して、公開されている機能に関連する優れたプラクティスを知りたいです。このコードは、ほぼすべてのアプリケーションで常に使用されるため、どのように実行する必要があるかを知っておくとよいでしょう。

どうもありがとう!

4

1 に答える 1

1

クラスのさまざまなインスタンスMailServerを送信元アドレスなどの適切な設定で登録し、それらをアプリケーションのそれぞれのコンポーネントに注入してみませんか?の消費者はIMailService、この詳細について知る必要はありません。


アップデート

私はStructureMapの構成エンジンの専門家ではありませんが、このようなものを使用する場合

var registry = new Registry();
registry.For<IMailServer>().Use<MailServer>();
registry.For<ServerData>().ConditionallyUse(x =>
{
  x.If(c => c.Root.RequestedType == typeof(Consumer1)).ThenIt.IsThis(new ServerData("1"));
  x.If(c => c.Root.RequestedType == typeof(Consumer2)).ThenIt.IsThis(new ServerData("2"));
});
var container = new Container(registry);
var consumer1 = container.GetInstance<Consumer1>();
Assert.AreEqual("1", consumer1.Server.ServerData.Foo);
var consumer2 = container.GetInstance<Consumer2>();
Assert.AreEqual("2", consumer2.Server.ServerData.Foo);

ServerDataさまざまなコンシューマーの各インスタンスに非常に特定のオブジェクトを注入できる必要があります。

于 2013-02-05T10:27:31.933 に答える