2011-04-26 23 views
12

मैं कई ठोस प्रकार है कि IHandler<TCommand> लागू, जैसे कि निम्न के साथ एक विधानसभा मिला के बैच पंजीकरण:Autofac: खुले सामान्य प्रकार

public class MoveCustomerHandler : IHandler<MoveCustomerCommand> 
{ 
    void IHandler<MoveCustomerCommand>.Handle(MoveCustomerCommand c) 
    { 
     // some business logic for moving a customer. 
    } 
} 

वर्तमान में, मैं उन्हें एक-एक करके दर्ज की कर रहा हूँ इस प्रकार है:

builder.RegisterType<MoveCustomerHandler>() 
    .As<IHandler<MoveCustomerCommand>>(); 

builder.RegisterType<ProcessOrderHandler>() 
    .As<IHandler<ProcessOrderCommand>>(); 

builder.RegisterType<SomeOtherFancyHandler>() 
    .As<IHandler<SomeOtherFancyCommand>>(); 

// Many handler registrations here... 

आदेश संचालकों, निर्माता इंजेक्शन का उपयोग कर इंजेक्ट किया जाता के रूप में नीचे देखा जा सकता है:

public class OrderController 
{ 
    private readonly IHandler<ProcessOrderCommand> handler; 

    public OrderController(IHandler<ProcessOrderCommand> handler) 
    { 
     this.handler = handler; 
    } 
} 

क्या ऑटोफैक का उपयोग करके मेरे सभी हैंडलर को आसान तरीके से बैच करने का कोई तरीका है?

उत्तर

22

जिम की जवाब देने के लिए एक समान शैली में लेकिन AsClosedTypesOf का लाभ लेने: आपकी प्रतिक्रिया के लिए

Assembly[] assemblies = GetYourAssemblies(); 

builder.RegisterAssemblyTypes(assemblies) 
    .AsClosedTypesOf(typeof(IHandler<>)); 
3

शायद आपको ऐसा कुछ चाहिए, हालांकि मुझे यकीन नहीं है कि IsAssignable() खुले जेनेरिक के साथ कैसे व्यवहार करता है।

Assembly[] assemblies = GetYourAssemblies(); 

builder.RegisterAssemblyTypes(assemblies) 
    .Where(t => t.IsAssignableFrom(typeof(IHandler<>))) 
    .AsSelf() 
    .AsImplementedInterfaces(); 
+0

धन्यवाद। मुझे यकीन नहीं है कि आप यहां पूरा करने का प्रयास करते हैं। 'Type.GetCustomAttributes() 'विधि' ऑब्जेक्ट []' देता है, तो यह मेरी मदद करने के लिए कैसे जा रहा है? – Steven

+0

मेरा बुरा। मैंने ब्राउजर टेक्स्ट बॉक्स में कॉपी/पेस्ट और एडिट करने की कोशिश की। मैंने उस हिस्से को संपादित किया। –

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