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 回答