2009-06-10 8 views
7

मैं स्ट्रक्चर मैप के साथ mvc.net का उपयोग कर रहा हूं ताकि मेरे लिए सभी रिपॉजिटरीज और सेवाओं को स्कैन और पंजीकृत किया जा सके। अब मैं सिंगलटन द्वारा पंजीकरण और कैश करना चाहता हूं। मैं कैसे कर सकता हूँ?मैं सिंगलटन द्वारा असेंबली और कैश में ऑटो स्कैन प्रकार के लिए स्ट्रक्चरमैप को कैसे कॉन्फ़िगर कर सकता हूं?

IContainer container = new Container(x => { 
      // Register Repositories and Services 
      x.Scan(y => { 
       y.AssemblyContainingType<SomeRepository>(); 
       y.AssemblyContainingType<SomeService>(); 

       y.IncludeNamespaceContainingType<SomeRepository>(); 
       y.IncludeNamespaceContainingType<SomeService>(); 
      }); 

      // Register Controllers 
      x.Scan(y => { 
       y.TheCallingAssembly(); 
       y.AddAllTypesOf<IController>().NameBy(type => type.Name.Replace("Controller", "")); 
      }); 
     }); 

उत्तर

19

2.6 में नए एपीआई का उपयोग करके, ITypeScanner को बहिष्कृत किया गया है। इसे इसके बजाय एक सम्मेलन के रूप में लागू किया जाना चाहिए।

Scan(a => 
    { 
     a.AssemblyContainingType<IMyPluginType>(); 
     a.With(new SingletonConvention<IMyPluginType>()); 
     a.AddAllTypesOf<IMyPluginType>(); 
    }); 

तब:

internal class SingletonConvention<TPluginFamily> : IRegistrationConvention 
    { 
     public void Process(Type type, Registry registry) 
     { 
      if (!type.IsConcrete() || !type.CanBeCreated() || !type.AllInterfaces().Contains(typeof(TPluginFamily))) return; 

      registry.For(typeof(TPluginFamily)).Singleton().Use(type); 
     } 
    } 
+0

+1 बीटीडब्लू, किसी को कॉल करने की आवश्यकता नहीं है। AddAllTypesOf (); स्कैन() में सिंगलटन कॉन्वेन्शन के रूप में। प्रोसेस() प्रकार (ओं) को reg reg जाएगा। – ozczecho

+0

मुझे 'स्कैन' में उन 3 लाइनों की आवश्यकता क्यों है? 'ए। (नया सिंगलटन कन्वेंशन ()) के बीच क्या अंतर है;' और 'ए। एडलट टाइप्स ();'? क्या वे दो वास्तव में जरूरी हैं? और यदि मेरे पास अन्य इंटरफ़ेस है, तो क्या मुझे फिर से दोनों लाइनों का उपयोग करने की आवश्यकता है? – tyron

+0

अत्यधिक वर्बोज़, लेकिन एक चैंप की तरह काम किया। वास्तव में सोचें कि यदि कथन का उपयोग करने की आवश्यकता हो, लेकिन मैं एपीआई बदलने वाला नहीं हूं। यह कहने के बाद कि मैं एपीआई नहीं बदलूंगा, इसका मतलब यह नहीं है कि मैं बेहतर नहीं कर सकता –

2

आप मुझे लगता है कि स्कैन कॉल बदल जाएगा होने के लिए, ITypeScanner क्या जेरेमी मिलर http://codebetter.com/blogs/jeremy.miller/archive/2009/01/20/create-your-own-auto-registration-convention-with-structuremap.aspx

उदाहरण के लिए अपने नियंत्रकों के लिए

तो पर की रूपरेखा के लिए इसी तरह लागू करने के लिए की आवश्यकता होगी:

x.Scan(y => { 
    y.TheCallingAssembly(); 
    y.With<MyNewTypeScanner>(); 
}); 

तो मैं कहीं और एक वर्ग को परिभाषित करता हूं जो इस तरह कुछ दिखता था:

public class MyNewTypeScanner: ITypeScanner 
{ 
    //This method is responsible for determining if a type should be registered 
    // and then passing it to RegisterType() if so 
    public void Process(Type type, PluginGraph graph) 
    { 
     //At this point you would probably just test to see if type is IController 
     //but you can get more sophisticated without too much headache. 

     this.RegisterType(graph, type); 
    } 


    private void RegisterType(PluginGraph graph, Type implementingType) 
    { 
     //The argument passed to FindFamily must be the type/class that will be requested out of SM 
     var family = graph.FindFamily(implementingType); 

     family.AddType(implementingType); 
     family.SetScopeTo(InstanceScope.Singleton); 
    } 
} 

यह आपके लिए चाल करना चाहिए।

0

@Eric हौसेर से जवाब पर विस्तार एक और अधिक आसानी से प्रयोग करने योग्य बनाने एक साधारण उदाहरण आप एक परंपरा है कि एक विशेष इंटरफ़ेस के सभी प्रकार के एक सिंगलटन हैं पंजीकृत करना चाहते है समाधान

public abstract class TypedRegistrationConvention<TPluginFamily> 
             : IRegistrationConvention 
{ 
    public virtual void Process(Type type, Registry registry) 
    { 
     if (!type.IsConcrete() 
      || !type.CanBeCreated() 
      || !type.AllInterfaces().Contains(typeof (TPluginFamily))) 
      return; 

     ApplyConvention(type, registry); 
    } 

    public abstract void ApplyConvention(Type type, Registry registry); 
} 

इस स्थापित बेस क्लास के साथ एक बार, आप टाइपिंग कोड के साथ चारों ओर घूमने के बिना सम्मेलन लागू कर सकते हैं।

public class SingletonConvention<TPluginFamily> 
           : TypedRegistrationConvention<TPluginFamily> 
{ 
    public override void ApplyConvention(Type type, Registry registry) 
    { 
     registry.For(typeof (TPluginFamily)).Singleton().Use(type); 
    } 
} 

अंत में बहुत सरल वर्ग।

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

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