2013-05-31 7 views
12

मैं प्याज वास्तुकला के बारे में सीख रहा हूं। मैं सेवा परत के बारे में भ्रम की स्थिति है, क्योंकि मैं कुछ कह रही है कि कोर परत केवल शामिल करना चाहिए लोगों को देखने के:प्याज वास्तुकला: व्यापार सेवाएँ इंटरफेस और कार्यान्वयन

  • मॉडल
  • भंडार इंटरफेस
  • सेवाएं इंटरफेस

लेकिन दूसरों कि व्यक्त यह सेवाओं के इंटरफेस को भी लागू करना चाहिए। तो सेवाओं को इंटरफेस को किस स्तर को लागू करना चाहिए?

मैंने सोचा था कि बुनियादी ढांचे परत को लागू करना चाहिए:

  • भंडार इंटरफेस
  • सेवाएं इंटरफेस

और जब अनुरोध किया उन्हें यूआई परत और टेस्ट परत को इंजेक्षन।

धन्यवाद!

+3

जेफरी पलेर्मो के अनुसार: * "प्याज वास्तुकला के समग्र दर्शन अपने आवेदन के बीच (कोर) में अपने व्यवसाय तर्क और मॉडल रखने के लिए और जहाँ तक जावक अपनी निर्भरता धक्का संभव के रूप में करने के लिए है। समस्या डोमेन तब आवश्यक बुनियादी ढांचे (परीक्षण, डेटाबेस, सुरक्षा इत्यादि) से पूरी तरह से स्वतंत्र है। उदाहरण के लिए, इसका मतलब है कि परीक्षण डेटाबेस एक्सेस वास्तविक डेटाबेस के बिना पूरी तरह से किया जा सकता है।"* –

+0

इसका मतलब है कि यदि एक वर्ग वर्कऑर्डर सेवा जो एक सेवा इंटरफ़ेस IWorkOrderService लागू करती है, को एक रिपॉजिटरी IOrderRepository की आवश्यकता होती है, तो उसे एक क्लास ऑर्डर रिपोजिटरी की आवश्यकता होगी जो उस भंडार इंटरफ़ेस को लागू करता है और उस श्रेणी के डिज़ाइन से बाहर है (इन्फ्रास्ट्रक्चर लेयर), तो सेवा वर्ग WorkOrderService इसका इस्तेमाल नहीं कर सकते हैं तो आप समस्या दिखाई दे रही है अन्य तरीके से:।? अगर आप कोर के बाहर सेवा इंटरफ़ेस IWorkOrderService लागू, आप भंडार IOrderRepository उदाहरणों प्राप्त करने के लिए डि/आईओसी का उपयोग करें और काम करवाने के कर सकते हैं । मेरा उपभोग है। – reliasr

+2

आपको इसे अपने प्रश्न में शामिल करना चाहिए। –

उत्तर

20

कोर परत शामिल करना चाहिए:

  • मॉडल/संस्थाओं/Pocos/Whatever_the_name ... यह सब डोमेन के बारे में है
  • सभी (खजाने और सेवाओं सहित) इंटरफेस
  • आपका कोर वस्तुओं व्यापार सेवाओं कार्यान्वयन (*)

(*) यदि आपका व्यवसाय ऑर्डर को संभालने के बारे में है, तो आपके IWorkOrderService के कार्यान्वयन को मूल परत में होना चाहिए। यदि आपके WorkOrderService को ShippingService (जो आपका व्यवसाय नहीं है) का उपयोग करने की आवश्यकता है, तो यह केवल कोर परत में परिभाषित IShippingService में हेरफेर करेगा और IShippingService कार्यान्वयन बुनियादी ढांचे परत में कहीं होगा।

यदि आपके WorkOrderService को OrderRepository की आवश्यकता है तो यह वही तरीके से किया जाएगा।

यहाँ एक कोड उदाहरण है:

namespace MyBusiness.Core.Services 
{ 
    internal class WorkOrderService: IWorkOrderService 
    { 
    public WorkOrderService(IOrderRepository orderRepository, IShippingService shippingService) 
    { 
     _orderRepository = orderRepository; 
     _shippingService = shippingService; 
    } 

    ... 
    } 
} 

यह आपके प्याज वास्तुकला की सबसे बाहरी परत ऊपर निर्भर करेगा - निर्भरता संकल्प परत - रन समय पर सही सेवा कार्यान्वयन के साथ अपने सभी इंटरफेस के लिए बाध्य करने के लिए।

For<IWorkOrderService>().Use<Core.Services.WorkOrderService>(); 
For<IShippingService>().Use<Infrastructure.Services.ShippingService>(); 
For<IOrderRepository>().Use<Infrastructure.Data.OrderRepository>(); 
संबंधित मुद्दे