2012-04-20 10 views
6
 var servers = new List<IChecker> { 
     //Server1 
     new DatabaseSystem { ServerName = "ANTIVIRUS" }, 
     new DatabaseSizes { ServerName = "ANTIVIRUS"}, 
     new DiskBackup { ServerName = "ANTIVIRUS"}, 
     new SqlServerEventLog { ServerName="ANTIVIRUS"}, 
     new DiskSystem { ServerName="ANTIVIRUS"}, 
     //Server1 
     new DatabaseSystem { ServerName="SEJKG-S-DB01" }, 
     new DatabaseSizes { ServerName = "SEJKG-S-DB01"}, 
     new DiskBackup { ServerName = "SEJKG-S-DB01"}, 
     new SqlServerEventLog { ServerName="SEJKG-S-DB01"}, 
     new DiskSystem { ServerName="SEJKG-S-DB01"}, 
    }; 

    var builder = new ContainerBuilder();    
    builder.RegisterInstance(notifiers).As<IList<INotifier>>();  
    builder.RegisterInstance(servers).As<IList<IChecker>>(); 
    builder.Register(c => new ServerChecker(c.Resolve<IList<IChecker>>(), c.Resolve<IList<INotifier>>())); 
    return builder.Build(); 

मैं कैसे मैं अपने "जहां सर्वर = नई सूची {..} 'कंटेनर बिल्डर रजिस्टर करना चाहिए के साथ एक समस्या है। मेरे iChecker की सूची एक पैरामीटर के रूप में पारित एक ServerChecker करने के लिए। इतना मैं हल करने के लिए सक्षम किया गया है, लेकिन नहीं ही सूची है, लेकिन मैं बाहर होना आवश्यक है। सर्वर की सामान्य सूची बहुत अधिक है।Autofac ContainerBuilder के लिए एक नया सूची <IChecker> रजिस्टर करने के लिए कैसे

उत्तर

9

Autofac है implicit collection support ऐसी है कि आप एक से अधिक अलग-अलग आइटम रजिस्टर कर सकते हैं और जब आप उन आइटम्स के एक आईनेमरेबल को हल करते हैं तो आपको सभी रजिस्ट्रेशन मिलेंगे:

var builder = new ContainerBuilder(); 
builder.RegisterType<FirstType>().As<IDependency>(); 
builder.RegisterType<SecondType>().As<IDependency>(); 
builder.RegisterType<ThirdType>().As<IDependency>(); 
var container = builder.Build(); 
using(var scope = container.BeginLifetimeScope()) 
{ 
    var allDependencies = scope.Resolve<IEnumerable<IDependency>>(); 
    // allDependencies will contain all three of the registered types. 
} 

यह आपको रजिस्ट्रेशन को बहुत सरल बनाने की अनुमति देगा क्योंकि आपको वास्तव में समय से पहले सूची बनाने की आवश्यकता नहीं होगी - आप अपने प्रत्येक "आईसीहेकर" या "इनोटिफायर" उदाहरणों को सीधे पंजीकृत कर सकते हैं और IENumerable को हल कर सकते हैं उनमें से

आप अपने "ServerChecker" निर्माता को बदलने के लिए नहीं बल्कि IList से IEnumerable लेने के लिए है, तो आप काम हो गया की क्षमता है - आप अब और c.Resolve() कुछ करने की आवश्यकता नहीं है। यह संभवतः एक बेहतर डिजाइन है क्योंकि IList का तात्पर्य है कि संग्रह बाद में संशोधित किया जा सकता है, जो शायद आप नहीं चाहते हैं। (हो सकता है कि सर्वर चेकर अपनी खुद की सूची में आईन्यूमेरेबल की सामग्री कॉपी करता है ताकि आप स्थानीय प्रतिलिपि को संशोधित कर सकें, लेकिन आप नहीं चाहते कि लोग सोचें कि वे केंद्रीय निर्भरता की सामग्री को संशोधित या संशोधित कर सकते हैं।)

यदि यह IList हो गया है, तो आप एक और पंजीकरण कि मक्खी पर सूची बनाता है जोड़ सकते हैं:

builder 
    .Register(c => new List<IDependency>(c.Resolve<IEnumerable<IDependency>>())) 
    .As<IList<IDependency>>(); 

इस तरह आप अभी भी c.Resolve < कर बच सकते हैं ...>() कॉल "सर्वर चेकर" के लिए रिज़ॉल्यूशन में - ऑटोफैक अचानक विशिष्ट प्रकार की सूची बनाने के तरीके के बारे में जानेंगे।

यदि आप वास्तव में इसके साथ फैंसी प्राप्त करना चाहते हैं, तो आप add a custom Autofac RegistrationSource कर सकते हैं जैसे कि अगर कोई भी IList Autofac को हल करने का प्रयास करता है तो स्वचालित रूप से IENumerable का हल करेगा और एक सूची बनायेगा ... लेकिन यह शायद आपको थोड़ा अधिक चाहिए ।

+0

मैंने सर्वर चेकर को सर्वर चेकर में बदल दिया (आईनेमेरेबल चेकर, आईनेमेरेबल नोटिफ़ायर)। फिर परिवर्तन builder.RegisterInstance(new DiskSystem { ServerName = "SEFWG-FLEFSH" }).As(); builder.RegisterType();

+0

यदि समाधान आपके लिए काम करता है, तो कृपया इसे उत्तर के रूप में चिह्नित करें। :) –

संबंधित मुद्दे