19

मेरे पास मेरी परियोजना में एक सामान्य भंडार है। निम्नलिखित नियंत्रक टुकड़ाएएसपी.नेट कोर में जेनेरिक रिपोजिटरी स्टार्टअप सीएस में प्रति तालिका अलग एडस्कोप्ड लाइन के बिना?

public class Lookup1Controller : Controller 
{ 
    readonly MyDbContext _db; 

    public Lookup1Controller(MyDbContext dataContext) 
    { 
     _db = dataContext; 
    } 

    public async Task<IActionResult> Index() 
    { 

     IGenericRepository<Lookup1> _repository = new GenericRepository<Lookup1>(_db); 
     var lookup1s = await _repository.SelectAll(); 

     return View(lookup1s); 
    } 

मैं दोनों मेरे जेनेरिक भंडार में मेरी डाटाबेस संदर्भ के साथ-साथ मेरी नियंत्रकों में से प्रत्येक की जरूरत नहीं दिख रहा है पर विचार करें।

public class Lookup1Controller : Controller 
{ 
    private IGenericRepository<Lookup1> _repository; 

    public Lookup1Controller(IGenericRepository<Lookup1> repository) 
    { 
     _repository = repository; 
    } 

    public async Task<IActionResult> Index() 
    { 
     var lookup1s = await _repository.SelectAll(); 

     return View(lookup1s); 
    } 

} 

जो मैं क्या पढ़ा से बहुत neater और ASP.NET 5 सबसे अच्छा अभ्यास है:

मैं करने के लिए इसे refactor। की मैं इंजेक्शन नहीं किया है GenericRepository इंटरफेस का उपयोग करने क्योंकि

InvalidOperationException: Unable to resolve service for type 'MyProject.Data.IGenericRepository`1[MyProject.Models.Lookup1]' while attempting to activate 'MyProject.Controllers.Lookup1. 

: लेकिन मैं अगर मैं अपने ब्राउज़र में है कि नियंत्रक मार्ग का उपयोग निम्न त्रुटि मिल जाएगा।

मैं ConfigureServices विधि

services.AddScoped<IGenericRepository<Lookup1>,GenericRepository<Lookup1>>(); 
services.AddScoped<IGenericRepository<Lookup2>,GenericRepository<Lookup2>>(); 
services.AddScoped<IGenericRepository<Lookup3>,GenericRepository<Lookup3>>(); 
services.AddScoped<IGenericRepository<Lookup4>,GenericRepository<Lookup4>>(); 
etc 
तो मेरे कोड एक अपवाद फेंकने के बिना चलाता है कि

में प्रत्येक और मेरी टेबल के हर के लिए मेरे Startup.cs एक AddScoped लाइन में जोड़ें।

हालांकि मेरे डेटाबेस में लगभग 100 सरल लुकअप टेबल हैं। जब मैं कोड की उपरोक्त 100 पंक्तियों को देखता हूं तो यह सही नहीं दिखता है।

यह कॉपी और पेस्ट कोड की तरह लगता है। प्रत्येक बार जब मैं एक नया मॉडल और नियंत्रक जोड़कर एक नई तालिका जोड़ता हूं तो मेरा कोड मुझे त्रुटि देने के बिना संकलित करेगा। लेकिन अगर मैं प्रोग्राम चलाता हूं और उस दृश्य पर जाता हूं तो मैं नियंत्रक को त्रुटि प्राप्त कर सकता हूं अगर मैं अपने Startup.cs पर एडस्कोप्ड लाइन जोड़ना भूल गया। रखरखाव के लिए वास्तव में अच्छा नहीं है।

मेरा प्रश्न:

  1. यह वास्तव में सबसे अच्छा अभ्यास Startup.cs की ConfigureServices विधि में प्रत्येक के लिए एक services.AddScoped और हर लुकअप तालिका के लिए है?

  2. यह एक सामान्य भंडार है इसलिए क्या उन 100 प्रतिलिपि और पेस्ट लाइनों को एक पंक्ति में लिखने का कोई तरीका नहीं है?

  3. यदि नहीं तो मेरे कोड का उपयोग करके ऐसा करने का सबसे अच्छा तरीका क्या है?

+0

आप' Lookup1Controller' के निर्माता का उपयोग जोड़ने'* पैरामीटर के रूप में *: 'सार्वजनिक लुकअप 1 नियंत्रक (IGenericRepository भंडार)'। इस प्रकार आप उम्मीद करते हैं कि * एमवीसी कॉल * कंट्रोलर कन्स्ट्रक्टर 'लुकअप 1 कंट्रोलर 'को इसी पैरामीटर के साथ कॉल करता है।'नई जेनेरिक रिपोजिटरी >() 'कौन बनाना चाहिए? क्या किसी को यह 'सूचकांक' कार्रवाई के एक बार या हर कॉल पर करना चाहिए? इस प्रकार आपके पास 'सेवाओं के बीच विकल्प है। AddTransient', 'services.AddScoped',' सेवाएं। AddSingleton' और 'services.AddInstance'। – Oleg

+0

यह एक मूल सीआरयूडी प्रणाली है। तो बनाएँ है। अद्यतन, हटाए गए तरीकों को हटाएं। ऐसा लगता है कि एडस्कोप्ड का उपयोग करने का मानक तरीका है: http: //wildermuth.com/2015/3/17/A_Look_at_ASP_NET_5_Part_3_-_EF7। यदि कोई बेहतर तरीका है तो कृपया साझा करें। – devc2

उत्तर

39

बस गैर सामान्य पंजीकरण भार के का उपयोग फिर दोनों अपने इंटरफेस के open generic types और कार्यान्वयन प्रदान (लोगों को जहां 2 Type वस्तुओं पारित करने के लिए की जरूरत है।):

services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>)); 

में अपने नियंत्रक `IGenericRepositoryसाथ एक विशेष प्रकार का भंडार के लिए एक निर्भरता (एक बंद सामान्य प्रकार)

public HomeController(IGenericRepository<Lookup1> repository) 
{ 
    ... 
} 
+0

धन्यवाद। कोड काम की एक पंक्ति बदलना। यह देखने के लिए इंतजार करेगा कि अगर कोई अच्छा अभ्यास है या नहीं, तो यह एएसपीनेट 5 ऐप के लिए अच्छा नहीं है या अल्टरेंटिव्स – devc2

+0

प्रदान करने का तरीका अन्य डीआई कंटेनर जैसे [Ninject] के समान है (http://stackoverflow.com/ए/10243699/1836 9 35) या [एकता] (https://msdn.microsoft.com/en-us/library/ff660936 (v = pandp.20) .aspx # Anchor_0)। चलो बस देखें कि किसी को एएसपी में अंतर्निहित कंटेनर के साथ किसी भी गॉथ के बारे में पता है। नेट 5 –

+3

यह मेरे लिए काम नहीं करता है। मुझे यह त्रुटि मिली: असफल: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [0] एक अनचाहे अपवाद हुआ है: 'SqlExpress.Helpers.LessonTagHelper' को सक्रिय करने का प्रयास करते समय 'SqlExpress.Repository.Interfaces.IChatRepository' टाइप करने के लिए सेवा को हल करने में असमर्थ। System.InvalidOperationException: 'SqlExpress.Helpers.LessonTagHelper' को सक्रिय करने का प्रयास करते समय 'SqlExpress.Repository.Interfaces.IChatRepository' टाइप करने के लिए सेवा को हल करने में असमर्थ। पर ... – Beetlejuice

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