2011-09-27 16 views
28

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

container.RegisterType<IAuthoringRepository, AuthoringRepository>(); 

मैं खिड़कियों पहचान एक पैरामीटर के रूप में पारित के साथ एक कारखाना विधि का उपयोग करने एकता कॉन्फ़िगर करने के लिए चाहते हैं (यानी: RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())) जब IAuthoringRepository का एक प्रकार का समाधान करने। मैं यह कैसे करु?

उत्तर

46

एक तरीका है रेपोजिटरी फैक्टरी आईआरपीओएसटीओटी फैक्ट्री लागू करने के लिए, फिर उसे पंजीकृत करें। हल किए गए प्रकार एक कारखाना प्राप्त कर सकते हैं, फिर इसकी CreateAuthoringRepository विधि को कॉल करें। वांछित होने पर आप CreateAuthoringRepositoryForCurrentIdentity नामक एक ओवरलोड बना सकते हैं, या एकता के साथ कारखाने की द्वितीय निर्भरता पंजीकृत कर सकते हैं।

मैं शायद एक कारखाना इंजेक्ट करता हूं और CreateAuthoringRepository विधि को आपके पास छोड़ देता हूं, तो क्लाइंट WindowsIdentity.GetCurrent() को पास करते हैं। इस तरह पहचान हमेशा ताजा होती है, और आप परीक्षण के लिए कारखाने का नकल कर सकते हैं।

वैकल्पिक रूप से, आप InjectionFactory साथ एक प्रतिनिधि निर्दिष्ट कर सकते हैं:

void Main() 
{ 
    using (var container = new UnityContainer()) 
    { 
     container.RegisterType<IAuthoringRepository>(
      new InjectionFactory(c => CreateAuthoringRepository())); 

     Console.WriteLine("debug - resolving model"); 
     var model = container.Resolve<Model>(); 
    } 
} 

public IAuthoringRepository CreateAuthoringRepository() 
{ 
    Console.WriteLine("debug - calling factory"); 
    return new AuthoringRepository 
     { Identity = WindowsIdentity.GetCurrent() }; 
} 

public class Model 
{ 
    public Model(IAuthoringRepository repository) 
    { 
     Console.WriteLine(
      "Constructing model with repository identity of " 
      + repository.Identity); 
    } 
} 

public interface IAuthoringRepository 
{ 
    IIdentity Identity { get; } 
} 

public class AuthoringRepository : IAuthoringRepository 
{ 
    public IIdentity Identity { get; set; } 
} 

यह प्रिंट:

debug - resolving model 
debug - calling factory 
Constructing model with repository identity of System.Security.Principal.WindowsIdentity

एकता 2.0 के लिए है यही कारण है कि। पिछले संस्करणों के साथ, StaticFactoryExtension देखें।

+1

धन्यवाद! एक आकर्षण की तरह काम किया =) – burnt1ce

+1

बिल्कुल सही! यह मेरे लिए भी काम करता है। –

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