2017-03-29 8 views
6

केवल पढ़ने-योग्य एपीआई सेवा पर काम करना और संचालन आधारित प्रक्रिया में संचालन को पैकेज करने के लिए जेनेरिक का उपयोग करना।एक सामान्य निर्भरता इंजेक्शन

भंडार इंटरफ़ेस:

public interface IRepository<TIdType,TEntityType> where TEntityType:class { 
    Task<EntityMetadata<TIdType>> GetMetaAsync(); 
} 

भंडार कार्यान्वयन:

public class Repository<TIdType,TEntityType> : IRepository<TIdType,TEntityType> where TEntityType:class { 
    public Repository(string connectionString) { // initialization } 
    public async Tas<EntityMetadata<TIdType>> GetMetaAsync() { // implementation } 
} 

Startup.cs -> ConfigureServices में:

services.AddSingleton<IRepository<int, Employee>> (p=> new Repository<int, Employee>(connectionString)); 
services.AddSingleton<IRepository<int, Department>> (p=> new Repository<int, Department>(connectionString)); 
// and so on 

नियंत्रक:

public class EmployeeController : Controller { 
    public EmployeeController(IRepository<int,Employee> repo) {//stuff} 
} 

मैं वर्तमान में ConfigureServices में इकाई प्रकार के सभी प्रकार के लिए भंडार implmentation दोहरा रहा हूँ। क्या यह सामान्य भी बनाने का कोई तरीका है?

services.AddSingleton<IRepository<TIdType, TEntityType>> (p=> new Repository<TIdType, TEntityType>(connectionString)); 

इसलिए नियंत्रक कन्स्ट्रक्टर कॉल में स्वचालित रूप से प्रासंगिक भंडार प्राप्त हो सकता है?

अद्यतन 1: कोई duplicate:

  1. भंडार कार्यान्वयन डिफ़ॉल्ट निर्माता
  2. नहीं है क्योंकि यह डिफ़ॉल्ट निर्माता नहीं है, मैं समाधान से जुड़ा हुआ प्रश्न में दिए गए प्रदान नहीं कर सकते।
  3. जब services.AddScoped(typeof(IRepository<>), ...) कोशिश कर मैं त्रुटि Using the generic type 'IRepostiory<TIdType,TEntityType>' requires 2 type arguments
+3

संभावित डुप्लिकेट [एएसपी.नेट कोर में जेनेरिक रिपोजिटरी के अलग डुप्लिकेट के बिना संभावित डुप्लिकेट Startup.cs में तालिका के अनुसार लाइन सामना?] (Http://stackoverflow.com/questions/33566075/generic-repository-in-asp-net-core-without-having-a-separate-addscoped-line-per) – zaitsman

+0

http://stackoverflow.com/questions/33566075/generic-repository-in-asp-net-core-without-having-a-separate-addscoped-line-per – zaitsman

+2

तकनीकी रूप से यह डुप्लिकेट है। लेकिन आप 2 पैरामीटर जब आप का उपयोग करने के 'typeof (IRepository <,>)' 'typeof (IRepository <>)' क्योंकि यह दो सामान्य मापदंडों – Tseng

उत्तर

9

हो रही है के बाद से यह सवाल अभी भी ठीक से duplicate के रूप में चिह्नित नहीं कर रहा है: जिस तरह से एक सामान्य वर्ग रजिस्टर करने के लिए:

services.AddScoped(typeof(IRepository<,>), typeof(Repository<,>)); 
अब

आप में यह हल कर सकते हैं निम्नलिखित तरीके:

serviceProvider.GetService(typeof(IRepository<A,B>)); 
// or: with extensionmethod 
serviceProvider.GetService<IRepository<A,B>>(); 
+0

उत्तर देने के लिए धन्यवाद, लेकिन रिपॉजिटरी को स्पष्ट करने के लिए डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है क्योंकि इसे कनेक्शन स्ट्रिंग के साथ आरंभ करने की आवश्यकता है। वर्तमान में मैं निर्भरता को 'सेवाओं' के रूप में पंजीकृत कर रहा हूं। AddSingleton > (पी => नया रिपोजिटरी (कनेक्शनस्ट्रिंग)); 'लेकिन 'सेवाओं का उपयोग करते समय मैं कनेक्शन स्ट्रिंग कैसे पास कर सकता हूं। AddScoped (टाइपऑफ (आईआरपीओएसटीरी <,>), टाइपोफ (रिपोजिटरी <,>)); ' – Vijay

+0

@ विजय IOptions पैटर्न का उपयोग करें, इस तरह आप टाइप किए गए वर्ग/विकल्पों को इंजेक्ट कर सकते हैं, तारों का काम नहीं करेगा जैसा कि आप कहते हैं कि मैन्युअल रूप से स्ट्रिंग को परिभाषित करने के लिए आप कन्स्ट्रक्टर –

+1

क्या आपका मतलब है कि मेरे भंडार की 'MyConnectionStringOptions' प्रकार पर निर्भरता होगी, जिसका अर्थ है कि मैं इसे डीआई में पंजीकृत करता हूं, जिसमें उचित कनेक्शन तारों के साथ आबादी होती है। ताकि भंडार का कन्स्ट्रक्टर कनेक्शन स्ट्रिंग विकल्प ऑब्जेक्ट 'GetService' का उपयोग कर सके और आगे बढ़ सके? – Vijay

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