2014-10-27 6 views
5

मान लें मैं कंटेनर में पंजीकृत से अधिक ऑब्जेक्ट, सभी एक ही इंटरफ़ेस को लागू है:आदेश जब महल विंडसर में ResolveAll बुला

container.Register(
    Component.For<ITask>().ImplementedBy<Task1>(), 
    Component.For<ITask>().ImplementedBy<Task2>(), 
    Component.For<ITask>().ImplementedBy<Task3>(), 
    Component.For<ITask>().ImplementedBy<Task4>(), 
); 

और मैं ITask के सभी कार्यान्वयन को हल करना चाहते हैं:

var tasks = container.ResolveAll<ITask>(); 

क्या हल किए गए उदाहरणों के आदेश को नियंत्रित करने का कोई तरीका है?

नोट: जाहिर है, मैं आईटस्क पर Order या Priority संपत्ति को कार्यान्वित कर सकता हूं, और केवल कार्यों की सूची को सॉर्ट कर सकता हूं, लेकिन मैं निम्न-स्तरीय समाधान की तलाश में हूं।

+0

+1 में उपयोगी नहीं हो सकता है हो सकता है। यह समस्या वास्तव में मुझे खराब करती है क्योंकि हैंडलर फ़िल्टर को सॉर्ट करने के लिए कार्यान्वयन के बारे में कुछ जानना आवश्यक है। मुझे उम्मीद है कि आपको अपने प्रश्न से बाहर करने के कुछ बेहतर तरीके मिलेंगे :) – samy

+0

@ सैमी मैं पूरी तरह से तुम्हारे साथ हूं, दोस्त। लेकिन, मुझे यह मानना ​​है कि यह विंडसर महल की समस्या नहीं है। मेरे सबसे अच्छे ज्ञान के लिए -ऑर्टिंग इकाइयां/घटक सिस्टम के व्यावसायिक तर्क का हिस्सा है और यह स्पष्ट रूप से नहीं है कि विंडसर कैसल किस प्रकार बनाया गया था।यह कुछ "ठंडा" सुविधाओं के साथ थोड़ा दूर हो सकता है – Leo

+0

@Saguiltay यदि आप विंडसर महल के प्रारंभिकरण के लिए बहुत अधिक निर्भरताओं को जोड़ने के बारे में चिंतित हैं- वैरोनिक डीआई और आईओसी निर्भरताओं को तोड़ने वाले हैं- तो आपको एक रैपर घटक बनाना चाहिए सॉर्टिंग, फ़िल्टरिंग इत्यादि के सभी तर्क। इसे एक इंटरफ़ेस को कार्यान्वित करें जो इन कार्यों को वापस करने के लिए एक विधि का खुलासा करता है और आखिरकार, इस रैपर को पंजीकृत करें जैसा कि आप आमतौर पर विंडसर कैसल – Leo

उत्तर

6

मुझे विश्वास है कि आप जो खोज रहे हैं वह हैंडलर फ़िल्टर जो दुर्लभ दस्तावेज और विंडसर कैसल 3 में तोड़ने वाले बदलावों पर आधारित है; यह घटकों के फ़िल्टरिंग और सॉर्टिंग प्रदान करता है। यहाँ उनके विकी पेज से एक उद्धरण

इंटरफ़ेस IHandlerSelector के समान है लेकिन फिल्टर/क्रमबद्ध container.ResolveAll द्वारा अनुरोध संचालकों की अनुमति() विधि

तो बुनियादी तौर पर आप को लागू करने की आवश्यकता होगी है IHandlerFilter इंटरफ़ेस और फिर विंडसर कंटेनर को प्रारंभ करते समय कर्नेल में यह कार्यान्वयन जोड़ें। source code से, इस इंटरफेस जब सभी को हल करने इस के समान कुछ ...

public interface IHandlerFilter 
{ 
    bool HasOpinionAbout(Type service); 
    IHandler[] SelectHandlers(Type service, IHandler[] handlers); 
} 

कर्नेल में हैंडलर फ़िल्टर जोड़ा जा रहा है नीचे की तरह कुछ हो जाएगा लग रहा है ...

var container = new WindsorContainer() 
     .Install(Configuration.FromXmlFile("components.config")); 
     container.Kernel.AddHandlersFilter(new YourHandlerFilterImplementation()); 

और उसके बाद ResolveAll वाली सेवाओं के घटकों को आपके स्वयं के कार्यान्वयन के आधार पर क्रमबद्ध किया जाएगा (और फ़िल्टर किया गया)

3

मैं दूसरी लियो की सलाह है कि आप क्या कर रहे हैं हैंडलर फ़िल्टर फ़िल्टर करें।

मेरे ब्लॉग मैं this example on how a simple handlers filter can be made है, जो जब वे के माध्यम से हल किया कर रहे हैं एक है कि आदेश दिया कार्य इंस्टेंस में जो परिणाम होता है पर ResolveAll<ITask> (या एक IEnumerable<ITask> इंजेक्शन हो जाता है जब):

class TaskHandlersFilter : IHandlersFilter 
{ 
    readonly Dictionary<Type, int> sortOrder = 
     new Dictionary<Type, int> 
     { 
      {typeof (PrepareSomething), 1}, 
      {typeof (CarryItOut), 2}, 
      {typeof (FinishTheJob), 3}, 
     }; 

    public bool HasOpinionAbout(Type service) 
    { 
     return service == typeof(ITask); 
    } 

    public IHandler[] SelectHandlers(Type service, IHandler[] handlers) 
    { 
     // come up with some way of ordering implementations here 
     // (cool solution coming up in the next post... ;)) 
     return handlers 
      .OrderBy(h => sortOrder[h.ComponentModel.Implementation]) 
      .ToArray(); 
    } 
} 

मैं भी एक more elaborate example है जो आदेश निर्दिष्ट करने के लिए प्रयुक्त एपीआई के साथ खेलता है - इस मामले में, मैं प्रकारों को किसी अन्य प्रकार के सापेक्ष अपनी स्थिति निर्दिष्ट करने की अनुमति दे रहा हूं, उदाहरण के लिए जैसे

[ExecutesBefore(typeof(ExecutePayment))] 
public class ValidateCreditCards : ITask { ... } 

जो/अपने ठोस स्थिति :)

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