2012-03-22 12 views
9

के साथ कन्वेंशन आधारित निर्भरता इंजेक्शन मेरे पास मेरे समाधान में दो परियोजनाएं हैं ... एक डोमेन प्रोजेक्ट और एमवीसी 3 वेब प्रोजेक्ट (उदा। MyApp.Domain और MyApp.Web)। पहले, Ninject.Extensions.Conventions ver का उपयोग करते समय। 2, मैं NinjectMVC3.cs फ़ाइल में निम्न कथन का उपयोग करने में सक्षम था, और मेरे समाधान (वेब ​​और डोमेन दोनों) में आवश्यक निर्भरताओं को ठीक से इंजेक्शन दिया गया था (उदाहरण के लिए IFoo स्वचालित रूप से Foo से जुड़ा हुआ है)।निनजा 3.0.0

kernel.Scan(x => 
{ 
    x.FromAssembliesMatching("*"); 
    x.BindWith<DefaultBindingGenerator>(); 
}); 

मैं सिर्फ Ninject 3.0.0 (रिलीज) और Ninject.Extensions.Conventions 3.0.0 (एक और रिलीज), लेकिन बाध्यकारी आधारित सम्मेलन वाक्य विन्यास बदल गया में अपग्रेड किया है। मैंने पाया है कि मैं नए संस्करण के साथ निम्नलिखित कथन का उपयोग कर सकता हूं, लेकिन यह केवल MyApp.Web में सम्मेलन आधारित इंटरफेस को स्वचालित रूप से बांधता है और MyApp में नहीं। डोमेन। पिछले संस्करण में पूरे संस्करण बाध्य इंटरफेस।

kernel.Bind(x => x 
    .FromThisAssembly() 
    .SelectAllClasses() 
    .BindToAllInterfaces()); 

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

- RegisterServices विधि में अपने मौजूदा कोड को दिखाने के लिए संपादित करें: -

private static void RegisterServices(IKernel kernel) 
{ 
    // This code used to work with v.2 of Ninject.Extensions.Conventions 
    // kernel.Scan(x => 
    // { 
    // x.FromAssembliesMatching("*"); 
    // x.BindWith<DefaultBindingGenerator>(); 
    // }); 

    // This is the new v3 code that automatically injects dependencies but only for interfaces in MyApp.Web, not MyApp.Domain 
    kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().BindToAllInterfaces()); 

    // I tried this code, but it throws "Error activating IDependencyResolver" at "bootstrapper.Initialize(CreateKernel)" 
    // kernel.Bind(x => x.FromAssembliesInPath(AppDomain.CurrentDomain.RelativeSearchPath).SelectAllClasses().BindToAllInterfaces()); 

    // These are dependencies in MyApp.Web that ARE being bound properly by the current configuration 
    // kernel.Bind<IMemberQueries>().To<MemberQueries>(); 
    // kernel.Bind<IGrantApplicationQueries>().To<GrantApplicationQueries>(); 
    // kernel.Bind<IMailController>().To<MailController>(); 

    // These are dependencies in MyApp.Domain that ARE NOT being bound properly by the current configuration, so I have to declare them manually 
    // They used to be injected automatically with version 2 of the conventions extention 
    kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope(); 
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
    kernel.Bind<IMemberServices>().To<MemberServices>(); 
    kernel.Bind<IGrantApplicationServices>().To<GrantApplicationServices>(); 

    // These are dependencies that SHOULD NOT be bound by convention as they require a different scope or have unique naming 
    kernel.Bind(typeof(EfDbContext)).ToSelf().InRequestScope(); 
    kernel.Bind<IConfigurationProvider>().To<WebConfigConfigurationProvider>().InSingletonScope(); 
    kernel.Bind<IAuthorizationProvider>().To<MyAppAuthorizationProvider>(); 
    kernel.Bind<IPrincipal>().ToMethod(ctx => HttpContext.Current.User).InRequestScope(); 
    kernel.Bind<IGrantApplicationDocumentServices>().To<MySpecialNameGrantAplicationDocumentServices>().InRequestScope(); 
} 
+0

आप को देखा [विकी] (https: // GitHub .com/Ninject/ninject.extensions.conventions/विकि)। यदि नहीं, तो क्या आप कुछ विचार दे सकते हैं कि कौन सा बिट आपको समझ में नहीं आता है? –

+0

रुबेन, मैंने विकी को देखा है। क्या समझ में नहीं आता है कि पुराना कोड 'x.FromAssembliesMatching (" * ") के साथ 'MyApp.Web और MyApp.Domain में मेरे सभी इंटरफेस को काम और बाध्य किया गया है। हालांकि, नए 3.0.0 के साथ, यह वाक्यविन्यास काम नहीं करता है। मैंने पाया है कि निकटतम 'x.FromThisAssembly() 'है, लेकिन यह केवल MyApp.Web के भीतर इंटरफेस को बांधता है (क्योंकि वह इंजेक्शन होता है)। यह MyApp.Domain में इंटरफेस को स्वचालित रूप से बाध्य नहीं करता है। – bigmac

+0

कोड को देखते हुए, आप हमेशा असेंबली प्राप्त कर सकते हैं (या तो ऐपडोमेन की असेंबली सूची या कुछ ओपथर तंत्र के माध्यम से) और सूची को स्पष्ट रूप से आपूर्ति करें। इसके अलावा मैं स्रोत को पढ़ने के लिए जोर देता हूं - यह इतना बड़ा नहीं है। https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions/BindingBuilder/AssemblyFinder.cs –

उत्तर

17

बराबर है:

kernel.Bind(x => x 
    .FromAssembliesMatching("*") 
    .SelectAllClasses() 
    .BindDefaultInterface()); 
+1

धन्यवाद रेमो। मुझे लगता है कि मैं एक मूर्ख हूँ। यह मैंने कोशिश की पहली चीजों में से एक था, लेकिन मैंने BindToDefaultInterfaces (बहुवचन) विधि का उपयोग किया जो असफल रहा।जब मैंने इसे एकवचन विधि में बदल दिया, तो यह काम किया। सभी पदों के लिए खेद है, लेकिन मैं आपकी मदद की बहुत सराहना करता हूं। आपकी सभी परियोजनाओं पर बढ़िया काम! – bigmac