2012-08-27 17 views
5

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

मैं एक Autofac मॉड्यूल, UserModule है, जो एक स्रोत, UserRegistrationSource, इस तरह पंजीकृत करता है बनाया है:

UserModule.cs

public class UserModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterSource(new UserRegistrationSource()); 
    } 
} 

UserRegistrationSource.cs

public class UserRegistrationSource : IRegistrationSource 
{ 
    public bool IsAdapterForIndividualComponents 
    { 
     get { return false; } 
    } 

    public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) 
    { 
     var serviceWithType = service as IServiceWithType; 
     if (serviceWithType == null) 
      yield break; 

     var serviceType = serviceWithType.ServiceType; 
     if (!serviceType.IsInterface || !typeof(IUserServices).IsAssignableFrom(serviceType) || serviceType != typeof(IUserServices)) 
      yield break; 

     var registrationBuilder = // something... 

     yield return registrationBuilder.CreateRegistration(); 
    } 
} 

UserServices.cs

public interface IUserServices : IDependency 
{ 
    void Add(string email, string password); 
} 

public class UserServices : IUserServices 
{ 
    private readonly EFMembershipManager _manager; 

    public UserServices(EFMembershipManager manager) 
    { 
     _manager = manager; 
    } 

    public void Add(string email, string password) 
    { 
     _manager.createUser(email, password); 
    } 
} 

EFMembershipManager.cs निर्माता

public EFMembershipManager(ServerRepository db, 
          ServerRepositoryMembershipProvider membershipProvider, 
          string testUsername, 
          string serverUsername) 
{ 
... 
} 

EFMembershipManager बाहरी परियोजना जो डि के लिए Ninject का उपयोग करता है और ServerRepository और ServerRepositoryMembershipProvider जिसे भी Ninject का उपयोग कर इंजेक्ट किया जाता का उपयोग करता है से एक वर्ग है।

और अब मैं अटक हूँ ...

चाहिए UserRegistrationSource एक निर्माता तर्क के रूप में Ninject कंटेनर (गिरी) लेने के लिए और IUserServices सेवा खोजने के लिए और उसके बाद मध्यस्थता करने Ninject गिरी पर ले कर कोशिश करते हैं और एक खाली लौट संख्यात्मक है कि Autofac IUserServices से संबंधित किसी भी चीज़ को हल करने का प्रयास नहीं करता है या यह गलत दृष्टिकोण है?

+1

क्या आप समझा सकते हैं कि इसे फिर से लिखने की आवश्यकता क्यों होगी? मुझे लगता है कि केवल इंजेक्शन से निपटने वाला छोटा कोड संशोधित करने की आवश्यकता होगी। आप समस्याओं का जिक्र करते हैं। वे विशेष रूप से क्या हैं? –

+1

@BertrandLeRoy पुन: लिखना इस तथ्य से आता है कि बाहरी प्रोजेक्ट में कई निर्भरता इंजेक्शन और अन्य परियोजनाओं के संदर्भ हैं जो निर्भरता इंजेक्शन के लिए निनजेक्ट का भी उपयोग करते हैं। तो काम करने के लिए सब कुछ पाने के लिए बहुत सारे संशोधन होंगे। जिस समस्या का सामना कर रहा हूं वह यह है कि मैं अपने ऑर्चर्ड मॉड्यूल में बाहरी प्रोजेक्ट को ऑटोफैक इंजेक्शन में सभी निंजा इंजेक्शन को परिवर्तित किए बिना कैसे संदर्भित कर सकता हूं। यदि यह भी संभव है। – Mattias

+0

मुझे नहीं लगता कि एक और तरीका है या यदि आप यह काम करने में सक्षम होंगे। बाहरी परियोजना को बाहरी रखने के लिए बेहतर हो सकता है। –

उत्तर

4

ऑटोफैक registration sources (और पंजीकरण स्रोत here पर अधिक समर्थन करता है) का समर्थन करता है। एक पंजीकरण स्रोत एक ऐसी सेवा है जिसे एक प्रकार को हल करने का प्रयास करते समय कंटेनर परामर्श करेगा। स्रोत, या तो प्रकार बनाने के लिए या एक खाली सूची का जवाब दे सकता है जो इंगित करता है कि स्रोत अनुरोधित प्रकार प्रदान करने में सक्षम नहीं है।

आपके मामले में, एक पंजीकरण स्रोत लागू किया जा सकता है जो आपके निंजा कंटेनर से अनुरोधित प्रकार को हल करने का प्रयास करेगा।

मैं ऑर्चर्ड से बहुत परिचित नहीं हूं लेकिन मुझे लगता है कि यह ऑटोफैक को कॉन्फ़िगर करने के लिए कॉन्फ़िगरेशन फ़ाइलों का उपयोग करता है। मेरा सुझाव यह है कि आप a simple Autofac module बनाते हैं जो आपके पंजीकरण स्रोत कार्यान्वयन को पंजीकृत करता है, और आप ऑर्चर्ड को load the module from config पर कॉन्फ़िगर करते हैं।

+0

ठीक है, अच्छा जवाब। कुछ अनुवर्ती अनुवर्ती .. क्या पंजीकरण स्रोत बाहरी प्रोजेक्ट, 'आईयूसर सर्विसेज' से जुड़ी सेवा की पहचान करता है, और इसे हल करने के लिए निनजेक कंटेनर (कर्नेल) को निर्देशित करता है और एक खाली संख्यात्मक लौटाता है जो ऑटोफैक को अनुरोधित प्रकारों को हल नहीं करता है या क्या यह गलत दृष्टिकोण है? – Mattias

+0

मेरा विचार यह है कि, क्योंकि यह ऑटोफैक होगा जो सेवाओं के लिए प्रारंभिक अनुरोध करता है, अगर स्रोत 'IUserServices' (और उस मामले के लिए हर दूसरी सेवा) का समर्थन करता है तो स्रोत "पूछा जाएगा"। इसके बाद निनजेक्ट से उस सेवा को हल करने का प्रयास करना चाहिए। यदि निनजेक्ट में सेवा है तो आप स्रोत से उदाहरण वापस कर सकते हैं। यदि नहीं, स्रोत खाली आता है। –

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