2013-11-01 8 views
5

मैं अपनी परियोजना में सेवा परतों के साथ भंडार पैटर्न का पालन कर रहा हूं। प्रत्येक दृश्य के लिए मैं एक व्यूमोडेल बनाने जा रहा हूं।एएसपी.नेट एमवीसी सेवा परत इनपुट आउटपुट डेटा

जो मैं उलझन में हूं, वह है कि, सेवा परत सीधे डोमेन ऑब्जेक्ट्स तक पहुंचें और उन्हें नियंत्रक को वापस कर दे, या मुझे डीटीओ का उपयोग करना चाहिए। अगर मुझे डीटीओ का उपयोग करना चाहिए, तो उन्हें परियोजना वास्तुकला में कहां रखा जाए?

धन्यवाद।

उत्तर

9

सेवा परत उपयुक्त business logic लागू करके डीटीओ ऑब्जेक्ट्स और डोमेन ऑब्जेक्ट्स मैपिंग (कनवर्टिंग) के लिए ज़िम्मेदार है।

आपकी डीटीओ वस्तुओं को नियंत्रकों और सेवाओं में उपयोग किया जाना चाहिए।

डीटीओ के दूसरी ओर डोमेन वस्तुओं पर, नियंत्रक और सेवा के बीच स्थानांतरित कर रहे हैं सेवा और भंडार

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

निम्नलिखित कोड एक उदाहरण है। प्रत्येक नेमस्पेस एक पैकेज पर विचार करें।

namespace Controllers 
{ 
    using Services; 
    using DataTransferObjects; 

    public class CoffeeController 
    { 
     public ICoffeeService CoffeeService { get; set; } 

     public JsonResult GetCoffee(GetCoffeeInDto inDto) 
     { 
      var result = CoffeeService.GetCoffee(inDto); 
      return JsonResult(result); 
     } 

     public JsonResult SaveCoffee(SaveCoffeeInDto inDto) 
     { 
      var outDto = CoffeeService.SaveCoffee(inDto); 
      return JsonResult(outDto); 
     } 
    } 
} 

namespace Services 
{ 
    using DataTransferObjects; 
    public interface ICoffeeService 
    { 
     GetCoffeeOutDto GetCoffee(GetCoffeeInDto inDto); 
     SaveCoffeeOutDto SaveCoffee(SaveCoffeeInDto inDto); 
    } 
} 

namespace Services.Impl 
{ 
    using Services; 
    using Repository; 
    using DataTransferObjects; 
    using Domain; 

    public class CoffeeService : ICoffeeService 
    { 
     public ICoffeeRepository CoffeeRepository { get; set; } 
     public GetCoffeeOutDto GetCoffee(GetCoffeeInDto inDto) 
     { 
      var entity = CoffeeRepository.Get(inDto.Id); 
      return new GetCoffeeOutDto {Id = entity.Id, Name = entity.Name}; 
     } 

     public SaveCoffeeOutDto SaveCoffee(SaveCoffeeInDto inDto) 
     { 
      var entity = new CoffeeEntity {Name = inDto.Name}; 
      CoffeeRepository.Save(entity); 
      return new SaveCoffeeOutDto {Id = entity.Id}; 
     } 
    } 
} 

namespace Repository 
{ 
    using Domain; 
    public interface ICoffeeRepository 
    { 
     CoffeeEntity Get(int id); 
     void Save(CoffeeEntity coffeeEntity); 
    } 
} 

namespace Repository.Impl 
{ 
    using Repository; 
    using Domain; 

    public class CoffeeRepository:ICoffeeRepository 
    { 
     public CoffeeEntity Get(int id) 
     { 
      //get entity from db 
      throw new System.NotImplementedException(); 
     } 

     public void Save(CoffeeEntity coffeeEntity) 
     { 
      //insert entity into db 
      throw new System.NotImplementedException(); 
     } 
    } 
} 

namespace DataTransferObjects 
{ 
    public class SaveCoffeeInDto 
    { 
     public string Name { get; set; } 
    } 

    public class SaveCoffeeOutDto 
    { 
     public int Id { get; set; } 
    } 

    public class GetCoffeeInDto 
    { 
     public int Id { get; set; } 
    } 

    public class GetCoffeeOutDto 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

namespace Domain 
{ 
    public class CoffeeEntity 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 
+0

अगर मैं GetCoffeeInDto के बजाय नियंत्रक को कॉफीइन्टिटी भेजता हूं, तो क्या मैं आर्किटेक्चर के नियम तोड़ता हूं? ऐसा लगता है कि मुझे डीटीओ का उपयोग करने के लिए डोमेन ऑब्जेक्ट्स को फिर से लिखना है। – SherleyDev

+0

हां, यदि आप नियंत्रक को एक इकाई भेजते हैं, तो आप आर्किटेक्चर का उल्लंघन करते हैं। लेकिन अगर आप अपनी परियोजना बड़ी नहीं हैं और आपका व्यवसाय पर्याप्त जटिल नहीं है, तो आपको इस आर्किटेक्चर का उपयोग करने की ज़रूरत नहीं है। डीटीओ और एंटिटी के रूप में अलग-अलग वस्तुओं को जानकारी और डेटा के बीच भेद के बारे में बताया जाता है। चिंताओं के सिद्धांत के पृथक्करण के संबंध में, डेटा परत में डेटा के साथ खेलना और प्रस्तुति परत में जानकारी के साथ खेलना अलग-अलग चिंताओं के रूप में सोचा जाता है और अलग-अलग वर्ग कार्यान्वयन के उपयोग के साथ आयोजित किया जाता है। – mecek

+0

+1 उत्कृष्ट उत्तर। @ शेरलेडेव यहां एक नज़र डालें: http://stackoverflow.com/a/21569720/654708 अधिक विस्तृत उत्तर के लिए। ध्यान दें, यह आपके नियंत्रक को अपने डोमेन मॉडल से बांधने के लिए स्वाभाविक रूप से खराब नहीं है; छोटी परियोजनाओं के लिए, डीटीओ बनाने के लिए ओवरकिल माना जा सकता है। – GFoley83

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