2013-02-05 90 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請參閱我的更新 –