2013-02-05 60 views
0

我知道,构造器的注入应是管理的真正需要的正确的工作依赖和类的行为时,可以应用。可选性的依赖注入(StructureMap)

即使如此,我想揭露这个例子。让我们假设一个邮件服务器类:

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地址,请从源地址,从密码。 MailData包含您要发送邮件的必需正文和地址。

两者都是必需的依赖关系。 哪些困扰我,我不知道如何解决的是ServerData可能在应用程序的不同位置不同。如果在发票系统中使用IMailServer,邮件应该来自'[email protected]',但如果在其他区域使用该邮件,则应该从'[email protected]'。

我不知道这是管理的正确方法。至于与依赖注入相关的所有内容,我想知道与已公开的功能相关的良好实践。这些代码总是以几乎所有的应用程序结束,知道如何完成它将是一件非常棒的事情。

非常感谢!

回答

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对象成您的各种消费者的每个实例。

+0

非常感谢塞巴斯蒂安为您的时间。不知道我完全理解如何注册多个实例或如何组合后。您能否提供一些链接或参考? – IoChaos

+0

@IoChaos请参阅我的更新 –