प्रमुख C # DI / IoC चौखटे की तुलना कैसे करते हैं? [बन्द है]


308

पवित्र युद्ध क्षेत्र में कदम रखने के जोखिम पर, इन लोकप्रिय DI / IoC फ्रेमवर्क की ताकत और कमजोरियां क्या हैं, और क्या कोई आसानी से सबसे अच्छा माना जा सकता है? ..:

  • Ninject
  • एकता
  • Castle.Windsor
  • Autofac
  • StructureMap

क्या C # के लिए कोई अन्य DI / IoC फ्रेमवर्क हैं जिन्हें मैंने यहां सूचीबद्ध नहीं किया है?

मेरे उपयोग के मामले के संदर्भ में, मैं एक ग्राहक WPF ऐप और एक WCF / SQL सेवाओं के बुनियादी ढांचे का निर्माण कर रहा हूं, उपयोग में आसानी (विशेष रूप से स्पष्ट और संक्षिप्त वाक्य रचना के संदर्भ में), निरंतर प्रलेखन, अच्छा समुदाय समर्थन और प्रदर्शन सभी महत्वपूर्ण कारक हैं मेरी पसंद में।

अपडेट करें:

जिन संसाधनों और डुप्लिकेट प्रश्नों का उल्लेख किया गया है, वे पुराने हैं, क्या इन सभी रूपरेखाओं का ज्ञान रखने वाला कोई व्यक्ति आगे आ सकता है और कुछ वास्तविक जानकारी प्रदान कर सकता है?

मुझे एहसास है कि इस विषय पर अधिकांश राय पक्षपाती होने की संभावना है, लेकिन मैं उम्मीद कर रहा हूं कि किसी ने इन सभी रूपरेखाओं का अध्ययन करने के लिए समय लिया है और कम से कम एक सामान्य रूप से उद्देश्य की तुलना की है।

अगर मैं पहले ऐसा नहीं किया गया था, तो मैं अपनी खुद की जांच करने के लिए तैयार हूं, लेकिन मैंने माना कि यह कम से कम कुछ लोगों ने पहले से ही किया था।

दूसरा अपडेट:

यदि आपके पास एक से अधिक DI / IoC कंटेनर के साथ अनुभव है, तो कृपया उन लोगों के पेशेवरों और विपक्षों को रैंक और सारांशित करें, धन्यवाद। यह उन सभी अस्पष्ट छोटे कंटेनरों की खोज में एक अभ्यास नहीं है जिन्हें लोगों ने बनाया है, मैं लोकप्रिय (और सक्रिय) चौखटे के बीच तुलना की तलाश कर रहा हूं।


1
[निन्यूज बनाम यूनिटी फॉर डीआई] ( stackoverflow.com/questions/1054801/ninject-vs-unity-for-di ) के रूप में एक ही सवाल है , लेकिन यह एक अनुवर्ती के लिए समय हो सकता है।
मैथ्यू फ्लैशेन

2
[तुलना कैसल विंडसर, एकता और StructureMap] (के संभावित डुप्लिकेट stackoverflow.com/questions/2216684/... )
मौरिसियो शेफ़र

@slomojo: संभावित डुप्लिकेट। stackoverflow.com/questions/4509458/ioc-comparisions-closed । इसके अलावा लिंक है जो उत्तर में आईओसी की लोकप्रियता को दर्शाता है। इस पर एक नज़र डालो।
दिनेश

@chibacity - मैंने इसे उपयोग किया है ... 4 परियोजनाएं, पहले दो वास्तव में बुनियादी थे, कोई समस्या नहीं, दूसरे दो, एकता ने हमें इतनी समस्याएं पैदा कीं जब यह कंस्ट्रक्टर इंजेक्शन, रखरखाव, पठनीयता के लिए आया। हमने एकता को दोनों से बाहर निकाल दिया और इसे स्ट्रक्च्योरपाइप के साथ बदल दिया, कंस्ट्रक्टर इंजेक्शन मृत सरल था, कॉन्फ़िगरेशन साफ ​​और रखरखाव योग्य था। अपने व्यक्तिगत समय में मैंने ऑटोफ़ैक के साथ खेला है, लेकिन मुझे यह बेहतर लगता है, इसे बेहतर समझने के लिए कुछ दस्तावेज़ीकरण करें। बाकी मैं केवल वही पढ़ सकता हूँ जो मैंने पढ़ा है।
फिल

एक मुद्दा जो हमारे पास SSRS के पास था, वह चुपचाप विफल हो रहा था और कोड के माध्यम से कदम उठाते हुए हम यह पता नहीं लगा सके कि यह विफल क्यों हो रहा था, अपवाद अस्पष्ट था। हमने इसे काम करने के लिए एक सप्ताह का काम लिखने के आसपास बिताया। आखिरकार जब हम स्ट्रक्चुरपेज़ में चले गए तो हमारे पास एक और प्रयास था, और मिनटों में 'ObjectFactory.WhatDoIHave ()' का उपयोग करके हमने जाना कि IoC का निर्माण असेंबलियों के AppDomain में लोड होने से पहले किया जा रहा था, इसलिए इंटरफेस को कभी भी कंक्रीट के साथ पंजीकृत नहीं किया गया था प्रकार के।
फिल

जवाबों:


225

हालांकि इस सवाल का एक व्यापक जवाब मेरी किताब के सैकड़ों पन्नों को लेता है , यहां एक त्वरित तुलना चार्ट है जो मैं अभी भी काम कर रहा हूं:

कई डीआईसी के बीच अंतर बताने वाली एक तालिका


40
मैंने आपकी पुस्तक का MEAP पढ़ा है और सोच रहा था कि आपने Ninject को इसमें से क्यों छोड़ा है?
मार्टिन ओवेन

2
आंशिक उत्तर यहाँ पाया जा सकता है: manning-sandbox.com/thread.jspa?threadID=38943
मार्क सेमन

25
@ मर्क, इसके लिए धन्यवाद, उम्मीद है कि आपके उत्तर में निनजे (महत्वपूर्ण, न केवल इसके बारे में नई प्रचार की वजह से, बल्कि यह नई भाषा सुविधाओं के उपयोग के कारण भी शामिल हो सकता है।)
23

3
ऑटोफेक के समान निनजेस्ट कई मायनों में है, इसका उपयोग NUGET टीम द्वारा किया जाता है, और सबसे लोकप्रिय डाउनलोड किया गया IOC कंटेनर नीचे है। मुझे निराशा हुई कि यह .NET बुक में मार्क के डिपेंडेंसी इंजेक्शन में नहीं था। अगर उद्योग को देखने का कोई दूसरा संस्करण है, तो उम्मीद है कि यह इसे पुस्तक में शामिल करेगा। मैं या तो यूनिटी, एमईएफ (एक वास्तविक डीआई नहीं), निनजेक्ट, या स्ट्रक्चुरपेज़ में दौड़ता हूं, मुझे बस एक अनुबंध या दूरस्थ टमटम पर उतरना है जो स्प्रिंग.नेट या ऑटोफेक आदि का उपयोग करता है ...
टॉम

2
एकता 3.5 पहले से ही कन्वेंशन आधारित पंजीकरण का समर्थन करता है: nuget.org/packages/Unity/3.5.1404 । एक नुकसान को दूर ;-)
व्लादिमीर Dorokhov

116

मुझे एक और प्रदर्शन तुलना (नवीनतम अपडेट 10 अप्रैल 2014) मिली । यह निम्नलिखित की तुलना करता है:

यहाँ पोस्ट से एक त्वरित सारांश है:

निष्कर्ष

निनजेक्ट निश्चित रूप से सबसे धीमा कंटेनर है।

MEF, LinFu और Spring.NET, Ninject की तुलना में तेज़ हैं, लेकिन फिर भी बहुत धीमे हैं। AutoFac, Catel और विंडसर आगे आते हैं, इसके बाद स्ट्रक्चुरेस्पोर्ट, यूनिटी और लाइटकोर। स्प्रिंग.नेट का एक नुकसान यह है कि इसे केवल एक्सएमएल के साथ कॉन्फ़िगर किया जा सकता है।

SimpleInjector, Hiro, Funq, Munq और Dynamo सबसे अच्छा प्रदर्शन प्रदान करते हैं, वे बहुत तेज़ हैं। उन्हें एक कोशिश करो!

विशेष रूप से सिंपल इंजेक्टर एक अच्छा विकल्प लगता है। यह बहुत तेज़ है, एक अच्छा दस्तावेज़ है और यह इंटरसेप्शन और जेनेरिक डेकोरेटर्स जैसे उन्नत परिदृश्यों का भी समर्थन करता है।

आप कॉमन सर्विस सेलेक्टर लाइब्रेरी का उपयोग करके भी देख सकते हैं और उम्मीद करते हैं कि कई विकल्प आज़माएँ और देखें कि आपके लिए सबसे अच्छा काम क्या है।

साइट से कॉमन सर्विस सिलेक्टर लाइब्रेरी के बारे में कुछ जानकारी:

पुस्तकालय IoC कंटेनर और सेवा लोकेटर पर एक अमूर्तता प्रदान करता है। पुस्तकालय का उपयोग करने से एक आवेदन अप्रत्यक्ष रूप से कठिन संदर्भों पर भरोसा किए बिना क्षमताओं का उपयोग करने की अनुमति देता है। आशा है कि इस पुस्तकालय का उपयोग करते हुए, तृतीय-पक्ष एप्लिकेशन और फ्रेमवर्क एक विशिष्ट कार्यान्वयन के लिए खुद को बांधने के बिना IoC / सेवा स्थान का लाभ उठाने के लिए शुरू कर सकते हैं।

अपडेट करें

13.09.2011: फंक और मुनक को प्रतियोगियों की सूची में जोड़ा गया। चार्ट भी अपडेट किए गए थे, और खराब प्रदर्शन के कारण स्प्रिंग.नेट को हटा दिया गया था।

04.11.2011: " सिंपल इंजेक्टर जोड़ा गया , प्रदर्शन सभी प्रतियोगियों में सर्वश्रेष्ठ है"।


(तुलना लिंक का अनुसरण करने से) हाल ही में अपडेट किया गया, गति अंतर देखने के लिए दिलचस्प है (साथ ही मूल विशेषताएं मैट्रिक्स)। धन्यवाद।
lko

यह तुलना इतनी विश्वसनीय नहीं है क्योंकि जहां तक ​​मुझे पता है कि निनजेक्ट में इंटरसेप्शन और एक्सएमएल दोनों कॉन्फ़िगरेशन के लिए एक्सटेंशन हैं, जबकि तुलना यह नहीं बताती है।
डैनियल

15
यह एक बहुत ही मात्रात्मक तुलना है। फ़ाइल आकार या निर्भरता की संख्या जैसी गैर-प्रदर्शन सुविधाओं के बारे में क्या आवश्यक है? इसके अतिरिक्त, प्रलेखन गुणवत्ता या प्रयोज्य जैसे व्यक्तिपरक उपाय मददगार होंगे। मेरा कहना है कि गति के अलावा अन्य कारकों पर विचार करना है।
फिस्टोफ्यूरी

1
जेरेमी मिलर की तरह, स्ट्रक्चुरपेज़ के लेखक ने अतीत में कहा है ... विरोधाभास - यह सुनिश्चित करें कि तेजी से आईओसी कंटेनर हैं, लेकिन उनके पास सुविधाओं का पूरा सेट नहीं है।
टॉम स्टिकेल

इसे देखें: iocservicestack.net
Rajesh

49

बस फिलिप मैट द्वारा इस महान .Net DI कंटेनर तुलना ब्लॉग को पढ़ें ।

वह कुछ संपूर्ण प्रदर्शन तुलना परीक्षण करता है;

वह ऑटोफेक की सिफारिश करता है क्योंकि यह छोटा, तेज, और उपयोग करने में आसान है ... मैं सहमत हूं। ऐसा प्रतीत होता है कि यूनिटी और निनजेक्ट उनके परीक्षणों में सबसे धीमे हैं।


5
पोस्ट .Net DI कंटेनर स्पीड रिडक्स के लिए एक अद्यतन है : नीचे पंक्ति में, पहले स्थान पर एकता के लिए गलत दृष्टिकोण लिया गया था। नए मापों के साथ एकता काफी बेहतर दिखती है।
वोल्कर वॉन ईनेम

33

अस्वीकरण: 2015 की शुरुआत में, जिमी बोगार्ड से आईओसी कंटेनर विशेषताओं की एक बड़ी तुलना है , यहां एक सारांश है:

तुलना कंटेनर:

  • Autofac
  • Ninject
  • सरल इंजेक्टर
  • StructureMap
  • एकता
  • विंडसर

परिदृश्य यह है: मेरे पास एक इंटरफ़ेस है, IMediator, जिसमें मैं एक अनुरोध / प्रतिक्रिया या कई प्राप्तकर्ता को सूचना भेज सकता हूं:

public interface IMediator 
{ 
    TResponse Send<TResponse>(IRequest<TResponse> request);

    Task<TResponse> SendAsync<TResponse>(IAsyncRequest<TResponse> request);

    void Publish<TNotification>(TNotification notification)
        where TNotification : INotification;

    Task PublishAsync<TNotification>(TNotification notification)
        where TNotification : IAsyncNotification; 
}

मैंने तब अनुरोधों / प्रतिक्रियाओं / सूचनाओं का एक आधार सेट बनाया:

public class Ping : IRequest<Pong>
{
    public string Message { get; set; }
}
public class Pong
{
    public string Message { get; set; }
}
public class PingAsync : IAsyncRequest<Pong>
{
    public string Message { get; set; }
}
public class Pinged : INotification { }
public class PingedAsync : IAsyncNotification { }

मुझे जेनरिक के लिए कंटेनर समर्थन के संबंध में कुछ चीजों को देखने में दिलचस्पी थी:

  • ओपन जेनेरिक के लिए सेटअप (IRequestHandler <,> आसानी से पंजीकृत करते हुए)
  • ओपन जेनरिक के कई पंजीकरणों के लिए सेटअप (दो या अधिक इनोटिफिकेशन हैंडलर)

सामान्य विचरण के लिए सेटअप (आधार संचय के लिए संचालकों को पंजीकृत करना / अनुरोध पाइपलाइन बनाना) मेरे हैंडलर बहुत सीधे हैं, वे सिर्फ कंसोल के लिए आउटपुट करते हैं:

public class PingHandler : IRequestHandler<Ping, Pong> { /* Impl */ }
public class PingAsyncHandler : IAsyncRequestHandler<PingAsync, Pong> { /* Impl */ }

public class PingedHandler : INotificationHandler<Pinged> { /* Impl */ }
public class PingedAlsoHandler : INotificationHandler<Pinged> { /* Impl */ }
public class GenericHandler : INotificationHandler<INotification> { /* Impl */ }

public class PingedAsyncHandler : IAsyncNotificationHandler<PingedAsync> { /* Impl */ }
public class PingedAlsoAsyncHandler : IAsyncNotificationHandler<PingedAsync> { /* Impl */ }

Autofac

var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterAssemblyTypes(typeof (IMediator).Assembly).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof (Ping).Assembly).AsImplementedInterfaces();
  • ओपन जेनेरिक: हाँ, स्पष्ट रूप से
  • एकाधिक खुले जेनरिक: हाँ, स्पष्ट रूप से
  • सामान्य विरोधाभासी: हाँ, स्पष्ट रूप से

Ninject

var kernel = new StandardKernel();
kernel.Components.Add<IBindingResolver, ContravariantBindingResolver>();
kernel.Bind(scan => scan.FromAssemblyContaining<IMediator>()
    .SelectAllClasses()
    .BindDefaultInterface());
kernel.Bind(scan => scan.FromAssemblyContaining<Ping>()
    .SelectAllClasses()
    .BindAllInterfaces());
kernel.Bind<TextWriter>().ToConstant(Console.Out);
  • ओपन जेनेरिक: हाँ, स्पष्ट रूप से
  • एकाधिक खुले जेनरिक: हाँ, स्पष्ट रूप से
  • सामान्य विरोधाभासी: हाँ, उपयोगकर्ता द्वारा निर्मित एक्सटेंशन के साथ

सरल इंजेक्टर

var container = new Container();
var assemblies = GetAssemblies().ToArray();
container.Register<IMediator, Mediator>();
container.Register(typeof(IRequestHandler<,>), assemblies);
container.Register(typeof(IAsyncRequestHandler<,>), assemblies);
container.RegisterCollection(typeof(INotificationHandler<>), assemblies);
container.RegisterCollection(typeof(IAsyncNotificationHandler<>), assemblies);
  • ओपन जेनेरिक: हाँ, स्पष्ट रूप से
  • एकाधिक खुले जेनरिक: हां, स्पष्ट रूप से
  • सामान्य विरोधाभासी: हाँ, संक्षेप में (अद्यतन 3.0 के साथ)

StructureMap

var container = new Container(cfg =>
{
    cfg.Scan(scanner =>
    {
        scanner.AssemblyContainingType<Ping>();
        scanner.AssemblyContainingType<IMediator>();
        scanner.WithDefaultConventions();
        scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
        scanner.AddAllTypesOf(typeof(IAsyncRequestHandler<,>));
        scanner.AddAllTypesOf(typeof(INotificationHandler<>));
        scanner.AddAllTypesOf(typeof(IAsyncNotificationHandler<>));
    });
});
  • ओपन जेनेरिक: हाँ, स्पष्ट रूप से
  • एकाधिक खुले जेनरिक: हां, स्पष्ट रूप से
  • सामान्य विरोधाभासी: हाँ, स्पष्ट रूप से

एकता

container.RegisterTypes(AllClasses.FromAssemblies(typeof(Ping).Assembly),
   WithMappings.FromAllInterfaces,
   GetName,
   GetLifetimeManager);

/* later down */

static bool IsNotificationHandler(Type type)
{
    return type.GetInterfaces().Any(x => x.IsGenericType && (x.GetGenericTypeDefinition() == typeof(INotificationHandler<>) || x.GetGenericTypeDefinition() == typeof(IAsyncNotificationHandler<>)));
}

static LifetimeManager GetLifetimeManager(Type type)
{
    return IsNotificationHandler(type) ? new ContainerControlledLifetimeManager() : null;
}

static string GetName(Type type)
{
    return IsNotificationHandler(type) ? string.Format("HandlerFor" + type.Name) : string.Empty;
}
  • ओपन जेनेरिक: हाँ, स्पष्ट रूप से
  • एकाधिक खुले जेनरिक: हां, उपयोगकर्ता द्वारा निर्मित विस्तार के साथ
  • जेनेरिक कंट्रोवर्सी: derp

विंडसर

var container = new WindsorContainer();
container.Register(Classes.FromAssemblyContaining<IMediator>().Pick().WithServiceAllInterfaces());
container.Register(Classes.FromAssemblyContaining<Ping>().Pick().WithServiceAllInterfaces());
container.Kernel.AddHandlersFilter(new ContravariantFilter());
  • ओपन जेनेरिक: हाँ, स्पष्ट रूप से
  • एकाधिक खुले जेनरिक: हाँ, स्पष्ट रूप से
  • जेनेरिक विरोधाभासी: हाँ, उपयोगकर्ता द्वारा निर्मित विस्तार के साथ

अति उत्कृष्ट! Btw, उपरोक्त सारांश विंडसर से चूक गया, लेकिन यह जिमी के मूल लेख में उपलब्ध है।
लुई

इससे पहले कि वाह कोई भी इसके बारे में चेतावनी दी है (: मैं विंडसर, धन्यवाद @Louis जोड़ा
stratovarius

21

वास्तव में आईओसी ढांचे के टन हैं। ऐसा लगता है कि हर प्रोग्रामर अपने करियर के किसी न किसी मोड़ पर लिखने की कोशिश करता है। शायद इसे प्रकाशित करने के लिए नहीं, बल्कि आंतरिक कामकाज को सीखने के लिए।

मैं व्यक्तिगत रूप से ऑटोफेक पसंद करता हूं क्योंकि यह काफी लचीला है और इसमें सिंटैक्स है जो मुझे सूट करता है (हालांकि मुझे वास्तव में नफरत है कि सभी रजिस्टर तरीके एक्सटेंशन तरीके हैं)।

कुछ अन्य ढांचे:


हाय @abatishchev! :) ... मूल विचार यह सुनिश्चित करना था कि तृतीय-पक्ष और अंतर्निहित तरीके एक ही पायदान पर थे; कई "रजिस्टर" तरीकों को अलग से जहाज करना पड़ता है (जैसे RegisterControllers()कि एमवीसी के लिए) इसलिए मुझे लगा कि उस मामले में डिजाइन करना सार्थक था। (यह 5 साल पहले डिजाइन किया गया था।)
निकोलस ब्लमहार्ट

1
@ निचलोलसुमहार्ट: हाय! :) देर से प्रतिक्रिया के लिए क्षमा करें, अधिसूचना दूसरों के बीच खो गई। वास्तव में इस तरह की संगति मेरे लिए मायने रखती है। अब आप कैसे सोचते हैं, आप इसे कैसे डिजाइन करेंगे?
abatishchev

@abatishchev मैं jgauffin से सहमत नहीं हूं। एक्सटेंशन विधियां विस्तार के लिए बंद नहीं हैं, वे विस्तार हैं। आप अपने ढांचे का मूल लिखते हैं जो यह सब करना चाहिए और विस्तार विधियों के साथ आप कुछ अतिरिक्त कार्यक्षमता प्रदान करते हैं, हो सकता है कि कुछ डिफ़ॉल्ट सहायक हों लेकिन कोई भी व्यक्ति अपने स्वयं के एक्सटेंशन लिखने के लिए स्वतंत्र है। मैं कहूंगा कि अगर आपका ढांचा इसे बढ़ाने के लिए विस्तार के तरीकों को स्वीकार करता है तो यह एक अच्छा ढांचा है।
t3chb0t

6

अब तक की सबसे अच्छी तुलना के आस-पास देखने के बाद, मैंने देखा:

यह मार्च 2010 में लिया गया एक सर्वेक्षण था।

मेरे लिए रुचि का एक बिंदु यह है कि जिन लोगों ने DI / IoC फ्रेमवर्क का उपयोग किया है और इसे पसंद / नापसंद करते हैं, उनके लिए StructureMap शीर्ष पर आता है।

पोल से यह भी प्रतीत होता है कि कैसल. विंडसर और स्ट्रक्च्योर मैप सबसे ज्यादा पसंदीदा हैं।

दिलचस्प बात यह है कि एकता और स्प्रिंग.नेट लोकप्रिय विकल्प प्रतीत होते हैं जो सबसे अधिक नापसंद हैं। (मैं एकता को आलस्य (और Microsoft बिल्ला / समर्थन) से बाहर करने पर विचार कर रहा था, लेकिन मैं अब कैसल विंडसर और स्ट्रक्चर्सपैप में अधिक निकटता से देखूंगा।)

बेशक यह (?) यूनिटी 2.0 पर लागू नहीं होता है जो मई 2010 में जारी किया गया था।

उम्मीद है कि कोई और प्रत्यक्ष अनुभव के आधार पर तुलना प्रदान कर सकता है।


2
एकता बहुत अच्छी है। इसमें अधिकांश को क्या चाहिए, हालांकि कुछ लोग इसके बारे में शिकायत करते हैं कि यह परिपत्र निर्भरता को हल नहीं करता है। मुझे यह पसंद है। मुझे वह सब कुछ चाहिए जो मुझे चाहिए।
दिमित्री नेस्टरुक

कई विकासकर्ता कैसल का उपयोग कर रहे हैं । NHibernate के लिए इसका डिफ़ॉल्ट आईओसी है । (कम से कम FluentNHibernate i downloded कल के साथ)। मैं भी एक NHibernate कार्यान्वयन देखा कि का उपयोग करता है LinFu nstead
3 बी

5

Linfu और spring.net सहित गूगल कोड पर नेट-आईओसी-फ्रेमवर्क की तुलना के लिए देखें जो इस पाठ को लिखते समय आपकी सूची में नहीं हैं।

मैंने स्प्रिंग.नेट के साथ काम किया: इसमें कई विशेषताएं हैं (अनूप, लाइब्रेरीज़, डॉन्स ...) और इसके साथ डॉटनेट और जावा-वर्ल्ड में बहुत अनुभव है। सुविधाओं को संशोधित किया जाता है, इसलिए आपको सभी सुविधाओं को लेना होगा। विशेषताएं डेटाबेससट्रैक्शन, लॉगिंगबैस्ट्रैक्शन जैसे सामान्य मुद्दों के सार हैं। हालांकि यह आईओसी-कॉन्फ़िगरेशन को करने और डिबग करने के लिए अलग है।

मैंने अब तक जो पढ़ा है, उससे: यदि मुझे एक छोटे या मध्यम प्रोजेक्ट के लिए चयन करना था, तो मैं ioc- कॉन्फ़िगरेशन का उपयोग करने और c # में डीबग करने योग्य होने के बाद से नए सिरे से उपयोग करूंगा। लेकिन मैंने इसके साथ काम किया है। अमूर्त-पुस्तकालयों के कारण बड़े मॉड्यूलर प्रणाली के लिए मैं spring.net के साथ रहूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.