8

का संदर्भ नहीं है, मैं अपने एएसपी.नेट एमवीसी 3 प्रोजेक्ट में NinjectMVC3 का उपयोग कर रहा हूं।निनजेक्ट को कार्यान्वित करने के लिए बाध्य करने के लिए कैसे कहें, इसमें

मैं 3 परतें

  • Foo.Web
  • Foo.Services
  • Foo.Data

Foo.Web संदर्भ Foo.Services नहीं बल्कि Foo.Data है। मेरी सेवाओं में से एक लग रहा है इस

public class FooService : IFooService 
{ 
    private readonly IFooRepository _fooRepository; 

    public FooService(IFooRepository fooRepository) 
    { 
     _fooRepository = fooRepository; 
    } 

    // ... 
} 

NinjectMVC3 Foo.Web स्टार्टअप

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IFooService>().To<FooService>(); 
    kernel.Bind<IFooRepository>().To<FooRepository>(); 
    // Foo.Web doesn't know what FooRepository is 
}   

मैं कैसे Foo.Web से FooServices निर्भरता इंजेक्षन कर सकते हैं में इस बूटस्ट्रैपिंग विधि कार्यान्वित की तरह?

+1

डुप्लिकेट: http://stackoverflow.com/questions/5267525/dal-bll-gui-composition-root-how-to-setup-di- बाइंडिंग –

उत्तर

7

आप सही दिशा में इशारा किया पाने के लिए, मैं तुम्हें onion architecture.

पर एक नज़र डालें यह मूल आधार है कि किसी भी कोड अधिक केंद्रीय परतों पर निर्भर कर सकता है सुझाव देना चाहेंगे। आपके परिदृश्य में (और यह रेपोजिटरी पैटर्न का उपयोग कर एमवीसी 3 ऐप्स के लिए एक आम बात है) आपके यूआई में सेवा परत का संदर्भ होना चाहिए और डेटा लेयर का संदर्भ होना स्वीकार्य है।

यदि आप इसे स्वीकार करने के इच्छुक हैं (यदि आप क्लासिक एन-स्तरीय सेटअप से आ रहे हैं, तो यह निगलने की एक कठिन गोली है, मुझे पता है), तो आपकी स्थिति बहुत आसान हो जाती है।

Ninject के साथ

अब आप इस प्रकार कुछ करना:

अपने NinjectMVC3.cs में, फ़ाइल अपने CreateKernel अब

/// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] 
          { 
           new ServiceDIModule(), 
           new RepositoryDIModule() 
          }; 

     var kernel = new StandardKernel(modules); 

     //RegisterServices(kernel); <-- Only if you have some custom binding 
     //        that are UI specific 
     return kernel; 
    } 

हो जाता है, अपनी सेवाओं को परत में आप Ninject (सिर्फ सादे Ninject के लिए एक संदर्भ जोड़ने

using Ninject.Modules; 

namespace MyServiceLayer 
{ 
    public class ServiceDIModule : NinjectModule 
    { 
     public override void Load() 
     { 
      //Bind Services 
      Bind<IPracticeService>().To<PracticeService>().InRequestScope(); 
     } 
    } 
} 

और आप के लिए एक ही प्रक्रिया को दोहराने: NuGet, NuGet के माध्यम से नहीं MVC3 dropin) और जोड़ने मैं क्या ServiceDIModule जो इस तरह दिखता है ऊपर बुलाया के माध्यम से आर डाटा टीयर इंजेक्शन आप

namespace MyDataLayer 
{ 
    public class RepositoryDIModule : NinjectModule 
    { 
     public override void Load() 
     { 
      //Bind Repos 
      Bind<IFooRepository>().To<FooRepository>().InRequestScope(); 
     } 
    } 
} 

अब, आप आप जिस तरह से अग्रिम की जरूरत बाइंडिंग के सभी के लिए उपयोग किया हो सकता है (UnitofWork, DatabaseFactory, IFooRepository, आदि)। तो, मेरे लिए आपका सवाल वास्तव में सोच में बदलाव के लिए उबाल जाता है। यदि आप प्याज अवधारणा को स्वीकार कर सकते हैं (बेरहमी से या अन्यथा), तो आपका परिदृश्य स्वयं को साफ करता है।

आप Project Silk और CodeCampServer भी देख सकते हैं। वे दोनों कुछ हद तक "प्याज" अवधारणा को लागू करते हैं (निश्चित रूप से रेशम, मैं अभी समाधान देख रहा हूं और यूआई वेब प्रोजेक्ट में डेटा प्रोज में एक रेफरी है जिसमें सभी रेपोज़ शामिल हैं)

मुझे बताएं आपको क्या लगता है।

+0

दिलचस्प। मुझे अभी भी यकीन नहीं है कि क्या आप मुझे निकालने की कोशिश कर रहे हैं;) लेकिन मैं इस विचार के साथ खेलूँगा। धन्यवाद। – MVCDatabaseInitializer

+0

अद्भुत जानकारी, धन्यवाद @ खेपरी –

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