2012-07-04 13 views
6

मैं यह मेरी कोड में एक निष्पक्ष बिट कर रही हो रहे हैं:क्या मुझे ऑटोफैक का उपयोग करके सामान्य कक्षाओं को स्पष्ट रूप से बांधना चाहिए?

public class ActionsModule : Module 
    { 
     protected override void Load(ContainerBuilder builder) 
     { 
      base.Load(builder); 
      builder.Register(c => LogManager.GetCurrentClassLogger()).As<ILog>().InstancePerDependency(); 

      // Autofac doesn't seem to be able to inject things without explicit binding 
      builder.RegisterType<ComboActions>().As<ComboActions>().InstancePerHttpRequest(); 
      builder.RegisterType<AppActions>().As<AppActions>().InstancePerHttpRequest(); 
     } 
    } 
} 

कहाँ 'क्रियाओं' वर्ग एक वर्ग मैं की आवश्यकता होती है मेरी नियंत्रक में इंजेक्शन किया जा रहा है, और विभिन्न अन्य उप निर्भरता है।

थोड़ा बकवास लगता है। ऑटोफैक क्यों हल नहीं कर सकता कि कक्षा में निर्भरता वाले निर्माता हैं जो पहले ही संतुष्ट हैं और एक उदाहरण स्वचालित रूप से बनाते हैं?

मैं मतलब, इंजेक्ट किया जा सकता है अगर वर्ग एक वर्ग बी की आवश्यकता है और वर्ग बी सी, डी, ई, आदि के लिए पर्याप्त उचित की आवश्यकता है, मुझे लगता है कि आप न पूरी निर्भरता श्रृंखला चलने के लिए अगर आप एक वर्ग बना सकते हैं देखना चाहते हैं चलने के समय पर। ... लेकिन यदि कक्षा ए सीधे सी और डी पर निर्भर करता है जो स्पष्ट रूप से बंधे हैं, निश्चित रूप से यह एक मामूली मामला है?

मैं कुछ याद आ रही है? इस के लिए कोई दस्तावेज नहीं दिख रहा है ...

उत्तर

2

AFAIK, ऑटोफैक को कंटेनर में पंजीकृत होने के लिए आवश्यक सभी आवश्यक प्रकार की आवश्यकता होती है, लेकिन इसका मतलब यह नहीं है कि आपको प्रत्येक व्यक्ति को अलग-अलग करना है। मेरी पंजीकरण की लगभग 99% प्रकार से इस विशेषता को जोड़कर नियंत्रित किया जाता है:

[AttributeUsage(AttributeTargets.Class)] 
public class AutoRegisterAttribute : Attribute { } 

उदाहरण के लिए, आप

[AutoRegister] 
class ComboActions 
{ 

होगा और फिर मैं उन्हें इस के साथ रजिस्टर:

public class AutoScanModule : Module 
{ 
    private readonly Assembly[] _assembliesToScan; 

    public AutoScanModule(params Assembly[] assembliesToScan) 
    { 
     _assembliesToScan = assembliesToScan; 
    } 

    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterAssemblyTypes(_assembliesToScan) 
      .Where(t => t.GetCustomAttributes(typeof (AutoRegisterAttribute), false).Any()) 
      .AsSelf() 
      .AsImplementedInterfaces() 
      .InstancePerLifetimeScope(); 
    } 
} 

जैसा कि मैंने कहा, यह मेरा पंजीकरण के सबसे को शामिल किया गया और उसके बाद मैं आमतौर पर केवल 3 पार्टी प्रकार, खुले जेनरिक और सज्जाकार की तरह चीजों के बारे में चिंता करने की ज़रूरत।

संपादित करें: reply from Kaleb कि मुझे गलत साबित करता है की जाँच करें। कूल फीचर मैं कभी नहीं जानता था!

20

आप हर प्रकार के रजिस्टर की जरूरत नहीं है। Autofac AnyConcreteTypeNotAlreadyRegisteredSource प्रदान करता है जो स्वचालित रूप से एक पंजीकरण प्रकार प्रदान नहीं करता है जो स्वचालित रूप से एक ठोस प्रकार ले जाएगा।

उदाहरण के लिए:

var builder = new ContainerBuilder(); 
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); 
var container = builder.Build(); 
... 
var myConcreteType = container.Resolve<MyConcreteType>(); 

सूत्रों अधिक जटिल चीज़ों, इंटरफेस और अमूर्त वर्ग आधारित निर्भरता के लिए automatically injecting mocked objects तरह अनुमति देते हैं।

+0

Whoah। इस बारे में कभी नहीं पता था। टीआईएल! –

+1

इस अद्भुत है, खासकर जब से तुम 'builder.RegisterSource की तरह कुछ कर सकते हैं (नई AnyConcreteTypeNotAlreadyRegisteredSource (x => x.Name.Contains (" ViewModel ")));' –

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

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