2016-03-29 8 views
11

अगर मैं निम्नलिखित प्रसंग है:काम की इकाई के माध्यम से संदर्भ में किसी विधि का उपयोग कैसे करें?

public partial class HRMainDataCTX : DbContext 
{ 
    public HRMainDataCTX() 
     : base("name=HRMainDataCTX") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    //DbSets 
    public virtual int SEARCHEMPLOYEE(Nullable<decimal> p_EMP_NUM, string p_EMP_NAME) 
    { 
     var p_EMP_NUMParameter = p_EMP_NUM.HasValue ? 
      new ObjectParameter("P_EMP_NUM", p_EMP_NUM) : 
      new ObjectParameter("P_EMP_NUM", typeof(decimal)); 

     var p_EMP_NAMEParameter = p_EMP_NAME != null ? 
      new ObjectParameter("P_EMP_NAME", p_EMP_NAME) : 
      new ObjectParameter("P_EMP_NAME", typeof(string)); 

     return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SEARCHEMPLOYEE", p_EMP_NUMParameter, p_EMP_NAMEParameter); 
    } 
} 

अब मैं काम की यूनिट को लागू इस तरह:

public class HRCTX : IDisposable 
{ 
    private readonly HRMainDataCTX _context; 

    public HRCTX() 
    { 
     _context = new HRMainDataCTX(); 
    } 

    public HRCTX(HRMainDataCTX context) 
    { 
     _context = context; 
    } 
    public int Save() 
    { 
     return _context.SaveChanges(); 
    } 

    public HRMainDataCTX Context 
    { 
     get { return _context; } 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 
} 

मैं कैसे विधि (संग्रहीत प्रक्रिया) का उपयोग करने की नहीं जानता SEARCHEMPLOYEE मेरे कोड में पीछे के माध्यम से UOW के माध्यम से।

+3

आपका प्रश्न स्पष्ट नहीं है, और इनाम हमें यह जवाब देने के लिए के रूप में यह – Evk

+0

@Evk है मदद नहीं करेगा: यदि आप लिखा जा सका क्या मेरे सवाल के बारे में विशेष रूप से स्पष्ट नहीं है! और मैं इसे समझाऊंगा। –

+1

आपने बास्फ़डर द्वारा नीचे दिए गए उत्तर पर टिप्पणी नहीं की है। तो अगर यह आपके प्रश्न का उत्तर नहीं देता है, तो क्या आप स्पष्ट कर सकते हैं क्यों? आपके बारे में वैध बिंदु हैं कि वास्तव में किसी भी रैपर की आवश्यकता नहीं है, क्योंकि डीबीकॉन्टेक्स्ट पहले से ही कार्य पैटर्न की इकाई का पालन करता है। – Evk

उत्तर

12

ठीक है, आपके मामले में आप अपने HRCTX प्रॉक्सी/यूओओ कक्षा में इस विधि के लिए बस एक और "प्रॉक्सी-विधि" जोड़ देंगे, या HRCTX इसके अंतर्निहित संदर्भ तक पहुंच प्रदान करता है - इसे सीधे इस तरह के संदर्भ पर कॉल करें:

HRCTX uow = new HRCTX(someContext); 
uow.Context.SEARCHEMPLOYEE(123, "123"); 

लेकिन मैं यह भी जोर देना कि DbContext पहले से ही कार्य पद्धति की एक इकाई (एक भंडार पैटर्न, see here के साथ संयुक्त) का प्रतिनिधित्व करता है चाहता था। आप मूल रूप से अपने संदर्भ के लिए प्रॉक्सी बना रहे हैं, जो - जहां तक ​​मैं इस उदाहरण में देख सकता हूं - कोई और लाभ या कार्यक्षमता नहीं जोड़ता है, इसलिए मैं कम से कम अपने HRMainDataCTX का उपयोग करने के बारे में सोचने का सुझाव दूंगा और संभवतः HRCTX से छुटकारा पा रहा हूं कक्षा।

+0

तो मुझे संदर्भ तक पहुंचने के लिए मेरे DAL.dll में एक संदर्भ जोड़ना होगा और यह 'UOW' बकवास –

+0

' प्रकार को उस असेंबली में परिभाषित किया गया है जिसका संदर्भ नहीं दिया गया है। आपको एक संदर्भ जोड़ना होगा ' –

+0

आपके' एचआरसीटीएक्स 'वर्ग में से एक सार्वजनिक कन्स्ट्रक्टर पैरामीटर के रूप में' HRMainDataCTX' लेता है, इसलिए आपको पहले से ही अपने DAL.dll को संदर्भित करने की आवश्यकता है। मैं @bassfader से सहमत हूं: केवल आपके द्वारा प्रदान किया गया कोड के साथ मैं सीधे आपके डीबीकॉन्टेक्स्ट का उपयोग करने पर कोई लाभ नहीं देख सकता। दो प्रस्तावित दृष्टिकोण एकमात्र विकल्प हैं जिनके बारे में मैं सोच सकता हूं। –

8

यदि आप अपने डीबीकॉन्टेक्स्ट और अपने व्यावसायिक तर्क को समाहित करना चाहते हैं तो आपको अपने यूनिट ऑफ वर्क पैटर्न के साथ रिपॉजिटरीज को लागू करने की आवश्यकता हो सकती है। (As suggested in the AspNet guidelines)

एक सामान्य तरीके से, काम की अपनी यूनिट इस तरह खजाने संभाल कर सकते हैं:

public class HRCTX : IDisposable 
{ 
    private readonly HRMainDataCTX _context; 
    private Dictionary<Type, object> Repositories { get; set; } 


    public HRCTX() 
    { 
     _context = new HRMainDataCTX(); 
     this.Repositories = new Dictionary<Type, object>(); 
    } 


    //Get and add a repository to the dictionary if ot does not exist 
    public IRepository<TEntity> GetNonGenericRepository<TEntity, TRepository>() where TEntity : class 
    { 
     if (this.Repositories.Keys.Contains(typeof(TRepository))) 
     { 
      return this.Repositories[typeof(TRepository)] as IRepository<TEntity>; 
     } 
     var repoType = typeof(TRepository); 
     var constructorInfo = repoType.GetConstructor(new Type[] { typeof(DbContext)}); 
     IRepository<TEntity> repository = (IRepository<TEntity>) constructorInfo.Invoke(new object[] { this._context}); 
     this.Repositories.Add(typeof(TRepository), repository); 
     return repository; 
    } 

public IRepository<TEntity> GetGenericRepository<TEntity>() where TEntity :  class 
    { 
     if (this.Repositories.Keys.Contains(typeof(TEntity))) 
     { 
      return this.Repositories[typeof(TEntity)] as IRepository<TEntity>; 
     } 

     IRepository<TEntity> repository = new Repository<TEntity>(this._context); 
     this.Repositories.Add(typeof(TEntity), repository); 
     return repository; 
    } 


} 

अपने खजाने के इंटरफेस और आधार वर्ग:

public interface IRepository<TEntity> where TEntity : class 
{ 
    TEntity Find(Expression<Func<TEntity, bool>> match); 
} 

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    protected DbContext Context { get; set; } 

    public Repository(DbContext context) 
    { 
     this.Context = context; 
    } 
    public TEntity Find(Expression<Func<TEntity, bool>> match) 
    { 
     return Context.Set<TEntity>().SingleOrDefault(match); 
    } 
} 

अब हिस्सा है जहां है आप स्पष्ट रूप से अपने व्यापार तर्क को समाहित करते हैं:

public class EmployeeRepository : Repository<Employee> 
{ 

    public EmployeeRepository(DbContext context) : base(context) { 

    } 
    public override Employee Find(Expression<Func<TEntity, bool>> match) 
    { 
     // You can either use the base class method or implement your custom logic 
    } 

    //This is where you encapsulate your business logic 
    public Employee FindSpecific(Nullable<decimal> employeeNum, string employeeName){ 
     return this.Context.SEARCHEMPLOYEE(employeeNum, employeeName); 
    } 
} 

फिर आप डोमेन संचालित डिज़ाइन तरीके से व्यवसाय तर्क तक पहुंचने के लिए आपके यूनिट ऑफ वर्क का उपयोग कर सकते हैं।

HRCTX unitOfWork= new HRCTX(dbContext); 
unitOfWork.GetNonGenericRepository<Employee, EmployeeRepository>().FindSpecific(1337,"1337"); 

यह आप एक जवाब के रूप उम्मीद क्या के लिए बहुत अधिक होने के लिए लग सकता है, लेकिन मैं आप अपने आवेदन कि जिस तरह से संरचना करने की जरूरत है अगर आप आप DbContext/दल सीधे बेनकाब करने के लिए नहीं करना चाहते हैं लगता है।

उम्मीद है कि यह मदद करता है!

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