महल विंडसर और ऑटो पंजीकरण

वोट
1

मैं एक महल n00b हूँ, और (ISomething कुछ द्वारा कार्यान्वित किया जाता) एक नामकरण परंपरा पर आधारित सेवाओं के लिए ऑटो रजिस्टर कार्यान्वयन करने के लिए महल विंडसर में सुविज्ञ एपीआई का उपयोग कर रहा हूँ। एक बात मैं समर्थन करना चाहते थे ऑटो पंजीकरण निर्भरता कि अलग DLLs में हैं लेने के लिए है, और उन ऑटो रजिस्टर, साथ ही है।

तो: IFoo फू (Foo.dll में दोनों) द्वारा कार्यान्वित किया जाता है, और फू Ibar, जो Bar.dll में है पर निर्भर करता है।

मैं वास्तव में ऑटो पंजीकरण प्रदर्शन करने के लिए लिखा निम्नलिखित कोड है। यह काम करने के लिए लगता है, लेकिन मुझे लगता है कि मैं बहुत ज्यादा अपने आप को काम किया सोच रहा हूँ। वहाँ एक आसान तरीका एक ही बात को पूरा करने के है?

private static void EnsureRegistered(Type t, IWindsorContainer container)
    {
        if (!container.Kernel.HasComponent(t) && (!(t.Assembly.FullName.StartsWith(System) || t.Assembly.FullName.StartsWith(mscorlib))))
        {
            bool registeredAtLeastOneComponent = false;

            container.Register(AllTypes.Pick().
                   FromAssembly(t.Assembly).If(delegate(Type t2)
                       {
                           //auto-registers all types that implement an interface where
                           //the name of the interface is the same as the class, minus the 'I'
                           //ex: EchoService is auto-registered as handler of IEchoService
                           Type[] interfaces = t2.GetInterfaces();
                           bool shouldRegister = false;
                           foreach(Type interfaceType in interfaces)
                           {
                               shouldRegister = t2.Name.Equals(interfaceType.Name.Substring(1))
                                                     && (!container.Kernel.HasComponent(interfaceType));
                               registeredAtLeastOneComponent = registeredAtLeastOneComponent || shouldRegister;
                               if (shouldRegister)
                                   break;
                           }
                           return shouldRegister;

                       }).WithService.Select(delegate(Type type, Type baseType)
                         {
                             Type serviceType = null;
                             Type[] interfaces = type.GetInterfaces();
                             foreach(Type interfaceType in interfaces)
                             {
                                 if (!type.Name.Equals(interfaceType.Name.Substring(1))) continue;
                                 serviceType = interfaceType;
                                 break;
                             }

                             return new Type[] {serviceType};

                         }));

            if (!registeredAtLeastOneComponent)
                return;

            //for each of the items in the graph, if they have see if they have dependencies
            //in other assemblies that aren't registered, register those dependencies as well
            foreach(GraphNode registered in container.Kernel.GraphNodes)
            {
               if (!(registered is Castle.Core.ComponentModel))
                    continue;

               Castle.Core.ComponentModel registeredComponent = registered as Castle.Core.ComponentModel;

               foreach(ConstructorCandidate constructor in registeredComponent.Constructors)
               {
                   foreach(DependencyModel dep in constructor.Dependencies)
                   {
                       EnsureRegistered(dep.TargetType, container);
                   }
               }
            }
        }
    }
12/03/2009 को 16:29
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
2

यह वास्तव में आप कैसे संरचना और अपने घटकों का नाम ... यदि आप कुछ सरल सम्मेलनों रखने ( "MyApp.Services.Impl" के तहत "MyApp.Services" नामस्थान के तहत यानी सभी घटक सेवाओं और उनके कार्यान्वयन) पर निर्भर करता है आप नाटकीय रूप से कम हो सकता है यह जटिलता (उदाहरण के लिए देखें ayende1 , ayende2 )।

इसके अलावा, IMO इस की उपयोगिता बल्कि सबसे सरल मामलों को छोड़कर कुछ सेवाओं आप किसी भी सेवा इंटरफ़ेस के बिना पंजीकृत करना चाहते हैं सीमित है ... उदाहरण के लिए, कुछ सेवाओं विन्यास, सेवा ओवरराइड, आदि की जरूरत है जो मामले में यह काम नहीं करेगा ।

12/03/2009 को 20:23
का स्रोत उपयोगकर्ता

वोट
0

सुनिश्चित नहीं हैं कि अगर यह आपके सवाल का जवाब है, लेकिन यह है कि क्या मैं ऑटो मेरी सेवाएं रजिस्टर करने के लिए किया था।

        // Auto-Register Services as Singletons
        container.Register(
            AllTypes.FromAssembly(typeof(BaseService).Assembly).Pick()
                    .WithService.DefaultInterfaces()
                    .Configure(s => s.LifestyleSingleton()));

मेरे सभी सेवाएं एक BaseService (सार कक्षा) और साथ ही एक अंतरफलक से विरासत - IService। यह स्वचालित रूप से इसके इंटरफेस के लिए कंक्रीट सेवा वर्ग के लिए बाध्य है और यह कंटेनर में उपयोग करने के लिए उपलब्ध हो जाएगा।

31/01/2013 को 16:54
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more