2012-12-19 17 views
7

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

public interface IRepository<T> 
{ 
    IEnumerable<T> FindAll(); 
    IEnumerable<T> FindById(int id); 
    IEnumerable<T> FindBy<A>(A type); 
} 

क्या यह निर्धारित करने के लिए जेनेरिक का उपयोग करना संभव है?

public IEnumerable<SomeClass> FindBy<A>(A type) 
{ 
    return _context.Set<SomeClass>().Where(x => x. == type); // I was hoping to do x.type and it would use the same variable to search. 
} 

थोड़ा बेहतर स्पष्टीकरण के लिए मैं एक स्ट्रिंग, int या जो भी प्रकार खोजना चाहता था, उस पर विचार करने पर विचार कर रहा था। क्या मैं के लिए उम्मीद कर रहा हूँ मैं x.something जहां कुछ चर में पारित करने के बराबर है कह सकता है।

मैं

public IDbSet<TEntity> Set<TEntity>() where TEntity : class 
{ 
    return base.Set<TEntity>(); 
} 

किसी भी सुझाव का उपयोग कर मेरी dbcontext के लिए किसी भी भंडार सेट कर सकते हैं?

उत्तर

4

काम आप इस तरह Expression<Func<T, bool>> बजाय A का उपयोग करते हैं:

public interface IRepository<T> 
{ 
    ... // other methods 
    IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate); 
} 

आप linq का उपयोग कर प्रकार से पूछताछ कर सकते हैं और कोड में क्वेरी निर्दिष्ट कर सकते हैं जो भंडार वर्ग को कॉल करता है।

public IEnumerable<SomeClass> FindBy(Expression<Func<SomeClass, bool>> predicate) 
{ 
    return _context.Set<SomeClass>().Where(predicate); 
} 

और यह फोन इस तरह:

var results = repository.FindBy(x => x.Name == "Foo"); 

और यह देखते हुए कि यह एक सामान्य अभिव्यक्ति है तो आपको प्रत्येक भंडार में इसे लागू करने की जरूरत नहीं है, आप इसे सामान्य आधार भंडार में हो सकता है।

public IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate) 
{ 
    return _context.Set<T>().Where(predicate); 
} 
+2

के खिलाफ तुलना करने के लिए x की कौन सी संपत्ति व्यक्तिगत रूप से मुझे इस दृष्टिकोण को पसंद है, लेकिन कई लोग नहीं करते हैं। इसका मतलब है कि भंडार के उपयोगकर्ता को यह पता होना चाहिए कि ईएफ सुरक्षित कौन से अभिव्यक्तियां हैं और कौन नहीं हैं, क्योंकि यह एक लकी अव्यवस्था है। – stevenrcfox

0

मैं बिल्कुल यह प्राप्त करने के लिए इंटरफ़ेस और सार कक्षाओं के संयोजन का उपयोग करता हूं।

public class RepositoryEntityBase<T> : IRepositoryEntityBase<T>, IRepositoryEF<T> where T : BaseObject 
// 
public RepositoryEntityBase(DbContext context) 
    { 
     Context = context; 
//etc 

public interface IRepositoryEntityBase<T> : IRepositoryEvent where T : BaseObject //must be a model class we are exposing in a repository object 

{ 
    OperationStatus Add(T entity); 
    OperationStatus Remove(T entity); 
    OperationStatus Change(T entity); 
    //etc 

तो व्युत्पन्न वर्ग एक में कुछ वस्तु विशिष्ट विधियों या वास्तव में कुछ भी नहीं हो सकता है और सिर्फ

public class RepositoryModule : RepositoryEntityBase<Module>, IRepositoryModule{ 
    public RepositoryModule(DbContext context) : base(context, currentState) {} 
} 
//etc