ডোমেন চালিত ডিজাইন: ডোমেন পরিষেবা, অ্যাপ্লিকেশন পরিষেবা


268

কেউ কিছু উদাহরণ সরবরাহ করে ডোমেন এবং অ্যাপ্লিকেশন পরিষেবাগুলির মধ্যে পার্থক্য ব্যাখ্যা করতে পারে? এবং, যদি কোনও পরিষেবা কোনও ডোমেন পরিষেবা হয় তবে আমি কি এই পরিষেবার প্রকৃত বাস্তবায়নটি ডোমেন অ্যাসেমব্লির মধ্যে রেখে দেব এবং যদি তাই হয় তবে আমিও সেই ডোমেন পরিষেবাতে সঞ্চিতাগুলি ইনজেক্ট করব? কিছু তথ্য সত্যই সহায়ক হবে।

উত্তর:


356

পরিষেবাগুলি 3 টি স্বাদে আসে: ডোমেন পরিষেবাদি , অ্যাপ্লিকেশন পরিষেবা এবং অবকাঠামো পরিষেবাদি

  • ডোমেন পরিষেবাদি : এমন ব্যবসায়িক যুক্তি সংযুক্ত করে যা স্বাভাবিকভাবে কোনও ডোমেন অবজেক্টের মধ্যে ফিট হয় না এবং এটি সাধারণত সিআরইউডি ক্রিয়াকলাপ নয় - এগুলি কোনও সংগ্রহশালার অন্তর্ভুক্ত
  • অ্যাপ্লিকেশন পরিষেবাদি : আপনার সিস্টেমে কথা বলার জন্য বাহ্যিক গ্রাহকরা ( ওয়েব পরিষেবাদি ভাবেন ) ব্যবহার করেন। যদি গ্রাহকদের সিআরইউডি অপারেশনে অ্যাক্সেসের প্রয়োজন হয় তবে তারা এখানে প্রকাশিত হবে।
  • অবকাঠামো পরিষেবাদি : প্রযুক্তিগত উদ্বেগগুলি (যেমন এমএসএমকিউ, ইমেল সরবরাহকারী, ইত্যাদি) বিমূর্ত করতে ব্যবহৃত হয়।

আপনার ডোমেন অবজেক্টের সাথে ডোমেন পরিষেবাদিগুলি বজায় রাখা বুদ্ধিমান - তারা সকলেই ডোমেন যুক্তিতে মনোনিবেশ করে। এবং হ্যাঁ, আপনি আপনার পরিষেবাগুলিতে সংগ্রহস্থলগুলি ইনজেকশন করতে পারেন।

অ্যাপ্লিকেশন পরিষেবাগুলি বাহ্যিক অনুরোধগুলি মোকাবেলায় সাধারণত ডোমেন পরিষেবাদি এবং সংগ্রহস্থল উভয়ই ব্যবহার করবে ।

আশা করি এইটি কাজ করবে!


2
আপনি সিকিউআরএস দ্বারা কমান্ড এবং কোয়েরি কোথায় রাখবেন? কোন পরিষেবা তাদের উত্পন্ন করে এবং কোন পরিষেবা তাদের পরিচালনা করে?
inf3rno

5
আমি মনে করি অ্যাপ্লিকেশন পরিষেবাদিগুলি "ওয়েব পরিষেবাদিগুলির" মতো প্রযুক্তিগত বিবরণে নির্দোষ হওয়া উচিত, তারা এই জাতীয় পরিষেবাগুলি দ্বারা ব্যবহৃত হয়। ডোমেন-চালিত ডিজাইনে পরিষেবাগুলি
ডিমান

1
@ প্রোগ্রাহারহ্যামার - একটি ডোমেন পরিষেবার উদাহরণ উদাহরণস্বরূপ ফান্ডস ট্রান্সফার সার্ভিসেস হতে পারে, যেখানে ডোমেন মডেলটি ব্যাংক অ্যাকাউন্টে থাকে, স্থানান্তরটিতে এমন কিছু ব্যবসায়িক যুক্তি থাকতে পারে যা অ্যাকাউন্ট অ্যাকাউন্টের সাথে সরাসরি ফিট করে না (ইভান্স ডিডিডি বই থেকে নেওয়া)।
জন্মদিন টোকোড

সুতরাং উদাহরণস্বরূপ বলুন লগইন ব্যবহারকারী () একটি ডোমেন পরিষেবার উদাহরণ হতে পারে। যেখানে getUser () হিসাবে একটি অ্যাপ্লিকেশন পরিষেবা হবে ??
ফিলিটি_উইজার্ড

উভয়ই বরং অ্যাপ্লিকেশন পরিষেবাদি কারণ প্রমাণীকরণ এবং প্রায়শই অনুমোদনের সিদ্ধান্তগুলি মূল ডোমেনের সাথে সম্পর্কিত নয়।
মগগানআর

114

(আপনি যদি পড়ার মতো মনে করেন না, নীচে একটি সংক্ষিপ্তসার রয়েছে :-)

আমিও অ্যাপ্লিকেশন পরিষেবাগুলির সুনির্দিষ্ট সংজ্ঞা দিয়ে লড়াই করেছি। যদিও বিজয়ের উত্তর আমার চিন্তা প্রক্রিয়ায় একমাস আগে খুব সহায়ক হয়েছিল, আমি এর অংশটির সাথে একমত হইনি।

অন্যান্য উৎস

অ্যাপ্লিকেশন পরিষেবা সম্পর্কে খুব কম তথ্য আছে। সামগ্রিক শিকড়, সংগ্রহশালা এবং ডোমেন পরিষেবাদির মতো বিষয়গুলি ব্যাপকভাবে আলোচনা করা হয়, তবে অ্যাপ্লিকেশন পরিষেবাগুলি কেবল সংক্ষেপে উল্লেখ করা হয় বা পুরোপুরি বাদ দেওয়া হয়।

এমএসডিএন ম্যাগাজিন নিবন্ধটি ডোমেন-চালিত ডিজাইনের পরিচিতি অ্যাপ্লিকেশন পরিষেবাগুলিকে আপনার ডোমেন মডেলটিকে বাহ্যিক ক্লায়েন্টগুলিতে রূপান্তর এবং / অথবা এক্সপোজার করার উপায় হিসাবে বর্ণনা করেছে, যেমন ডাব্লুসিএফ পরিষেবা হিসাবে। বিজয় অ্যাপ্লিকেশন পরিষেবাগুলিকেও এভাবে বর্ণনা করে। এই দৃষ্টিকোণ থেকে, অ্যাপ্লিকেশন পরিষেবাগুলি আপনার ডোমেনের একটি ইন্টারফেস

পেঁয়াজ আর্কিটেকচারে জেফ্রি পলর্মো এর প্রবন্ধ (পার্ট এক , দুই এবং তিন ) একটি ভাল পঠিত হয়। তিনি অ্যাপ্লিকেশন পরিষেবাগুলিকে অ্যাপ্লিকেশন-স্তরের ধারণা হিসাবে ব্যবহার করে যেমন ব্যবহারকারীর সেশন। যদিও এটি অ্যাপ্লিকেশন পরিষেবাদি সম্পর্কে আমার বোধগম্যতার কাছাকাছি, তবুও এটি বিষয়টিতে আমার চিন্তার সাথে সামঞ্জস্য নয়।

আমার চিন্তা

আমি অ্যাপ্লিকেশন পরিষেবাগুলি অ্যাপ্লিকেশন দ্বারা সরবরাহিত নির্ভরতা হিসাবে ভাবতে এসেছি । এই ক্ষেত্রে অ্যাপ্লিকেশনটি কোনও ডেস্কটপ অ্যাপ্লিকেশন বা ডাব্লুসিএফ পরিষেবা হতে পারে।

ডোমেইন

একটি উদাহরণ জন্য সময়। আপনি আপনার ডোমেন দিয়ে শুরু করবেন। বাহ্যিক সংস্থার উপর নির্ভর করে না এমন সমস্ত সত্তা এবং যে কোনও ডোমেন পরিষেবা এখানে প্রয়োগ করা হয়েছে। বাহ্যিক সংস্থানগুলির উপর নির্ভর করে যে কোনও ডোমেন ধারণাগুলি একটি ইন্টারফেস দ্বারা সংজ্ঞায়িত করা হয়। এখানে একটি সম্ভাব্য সমাধান বিন্যাস (সাহসীভাবে প্রকল্পের নাম):

আমার সমাধান
- My.Product.Core (My.Product.dll)
  - ডোমেন সার্ভিসেস
      IExchangeRateService
    প্রোডাক্ট
    ProductFactory
    IProductRepository

Productএবং ProductFactoryশ্রেণীর কোর সমাবেশ বাস্তবায়িত হয়েছে। IProductRepositoryএমন কিছু বিষয় যা সম্ভবত একটি ডাটাবেস সমর্থন করা হয়। এর বাস্তবায়ন ডোমেনের উদ্বেগ নয় এবং তাই একটি ইন্টারফেস দ্বারা সংজ্ঞায়িত।

আপাতত, আমরা এর উপর ফোকাস করব IExchangeRateService। এই পরিষেবার জন্য ব্যবসায়ের যুক্তি একটি বহিরাগত ওয়েব পরিষেবা দ্বারা প্রয়োগ করা হয়। যাইহোক, এর ধারণাটি এখনও ডোমেনের অংশ এবং এই ইন্টারফেস দ্বারা প্রতিনিধিত্ব করা হয়।

অবকাঠামো

বাহ্যিক নির্ভরতা প্রয়োগের প্রয়োগের অবকাঠামোর অংশ:

আমার সমাধান
+ My.Product.Core (My.Product.dll)
- মাই.প্রডাক্ট। ইনফ্রাস্ট্রাকচার (মাই.প্রডাক্ট। ইনফ্রাস্ট্রাকচার.ডিল)
  - ডোমেন সার্ভিসেস
      XEExchangeRateService
    SqlServerProductRepository

XEExchangeRateServicexe.com এরIExchangeRateService সাথে যোগাযোগ করে ডোমেন পরিষেবা প্রয়োগ করে । এই প্রয়োগটি আপনার অ্যাপ্লিকেশনগুলি ব্যবহার করতে পারে যা আপনার ডোমেন মডেলটি অবকাঠামোগত সমাবেশকে অন্তর্ভুক্ত করে ব্যবহার করে।

আবেদন

মনে রাখবেন যে আমি এখনও অ্যাপ্লিকেশন পরিষেবাদির উল্লেখ করি নি। আমরা এখন তাদের তাকান। ধরা যাক আমরা একটি IExchangeRateServiceবাস্তবায়ন সরবরাহ করতে চাই যা দ্রুত অনুসন্ধানের জন্য ক্যাশে ব্যবহার করে। এই সাজসজ্জার শ্রেণীর রূপরেখার মতো দেখতে পারে।

public class CachingExchangeRateService : IExchangeRateService
{
    private IExchangeRateService service;
    private ICache cache;

    public CachingExchangeRateService(IExchangeRateService service, ICache cache)
    {
        this.service = service;
        this.cache = cache;
    }

    // Implementation that utilizes the provided service and cache.
}

ICacheপ্যারামিটার লক্ষ্য করুন ? এই ধারণাটি আমাদের ডোমেনের অংশ নয়, সুতরাং এটি কোনও ডোমেন পরিষেবা নয়। এটি একটি অ্যাপ্লিকেশন পরিষেবা । এটি আমাদের অবকাঠামোর নির্ভরতা যা অ্যাপ্লিকেশন সরবরাহ করতে পারে। আসুন এমন একটি অ্যাপ্লিকেশন প্রবর্তন করুন যা এটি দেখায়:

আমার সমাধান
- My.Product.Core (My.Product.dll)
  - ডোমেন সার্ভিসেস
      IExchangeRateService
    প্রোডাক্ট
    ProductFactory
    IProductRepository
- মাই.প্রডাক্ট। ইনফ্রাস্ট্রাকচার (মাই.প্রডাক্ট। ইনফ্রাস্ট্রাকচার.ডিল)
  - অ্যাপ্লিকেশন সার্ভিস
      ICache
  - ডোমেন সার্ভিসেস
      CachingExchangeRateService
      XEExchangeRateService
    SqlServerProductRepository
- মাই.প্রডাক্ট.ডব্লিউসিএফস সার্ভিস (মাই.প্রডাক্ট।
  - অ্যাপ্লিকেশন সার্ভিস
      MemcachedCache
    IMyWcfService.cs
  + মাইডাব্লুসিএফসোর্স.সিভিসি
  + ওয়েবকনফিগ

এই সমস্ত অ্যাপ্লিকেশনটিতে এই জাতীয় একত্রিত হয়:

// Set up all the dependencies and register them in the IoC container.
var service = new XEExchangeRateService();
var cache = new MemcachedCache();
var cachingService = new CachingExchangeRateService(service, cache);

ServiceLocator.For<IExchangeRateService>().Use(cachingService);

সারসংক্ষেপ

একটি সম্পূর্ণ অ্যাপ্লিকেশনটিতে তিনটি প্রধান স্তর থাকে:

  • ডোমেইন
  • অবকাঠামো
  • আবেদন

ডোমেন স্তরটিতে ডোমেন সত্তা এবং একা থাকা ডোমেন পরিষেবা রয়েছে। যে কোনও ডোমেন ধারণাগুলি (এতে ডোমেন পরিষেবাগুলি অন্তর্ভুক্ত রয়েছে তবে ভান্ডারগুলিও অন্তর্ভুক্ত রয়েছে) যা বাহ্যিক সংস্থার উপর নির্ভর করে ইন্টারফেস দ্বারা সংজ্ঞায়িত হয়।

অবকাঠামো স্তরটিতে ডোমেন স্তর থেকে ইন্টারফেসের প্রয়োগ রয়েছে। এই প্রয়োগগুলি অ্যাপ্লিকেশন সরবরাহ করতে হবে এমন নতুন নন-ডোমেন নির্ভরতা প্রবর্তন করতে পারে। এগুলি অ্যাপ্লিকেশন পরিষেবা এবং ইন্টারফেস দ্বারা প্রতিনিধিত্ব করা হয়।

অ্যাপ্লিকেশন স্তরটিতে অ্যাপ্লিকেশন পরিষেবাদির প্রয়োগ রয়েছে। যদি পরিকাঠামো স্তর দ্বারা সরবরাহিত প্রয়োগগুলি পর্যাপ্ত না হয় তবে অ্যাপ্লিকেশন স্তরটিতে ডোমেন ইন্টারফেসের অতিরিক্ত প্রয়োগও থাকতে পারে।

যদিও এই দৃষ্টিকোণ পরিষেবার সাধারণ ডিডিডি সংজ্ঞার সাথে মেলে না, এটি ডোমেনটিকে অ্যাপ্লিকেশন থেকে আলাদা করে দেয় এবং আপনাকে বেশ কয়েকটি অ্যাপ্লিকেশনের মধ্যে ডোমেন (এবং অবকাঠামো) সমাবেশ ভাগ করে নিতে দেয়।


2
@ ডারিও-জি: আপনাকে অনুরোধ মডেল থেকে আপনার ডোমেন মডেলটির পুনর্গঠন / পুনঃনির্মাণ করতে হবে এবং ডোমেন পরিষেবাটিতে ডোমেন মডেলটি পাস করতে হবে। এই প্রশ্নটি আপনাকে কিছু ধারণা সরবরাহ করতে পারে। যদি তা না হয় তবে আমাকে জানান এবং আমি অন্য প্রশ্নের উত্তর যুক্ত করার জন্য আমার কিছু সময় আছে কিনা তা আমি দেখতে পাচ্ছি।
নীলস ভ্যান ডের রেস্ট

1
@ টেন্ডিক: আপনার IExchangeRateServiceইন্টারফেস বলতে কি বোঝায় ? এটি একটি ডোমেন ধারণা, অর্থাত্ আপনার গ্রাহকের সর্বব্যাপী ভাষায় অন্তর্ভুক্ত এমন কিছু। আপনার ডোমেনের অন্যান্য অংশগুলি এই পরিষেবার উপর নির্ভর করতে পারে, এজন্যই এর ইন্টারফেসটি ডোমেন স্তরে সংজ্ঞায়িত করা হয়েছে। তবে এর বাস্তবায়নে একটি বাহ্যিক ওয়েব পরিষেবাদি জড়িত, তাই বাস্তবায়নকারী শ্রেণি অবকাঠামো স্তরে থাকে। এইভাবে ডোমেন স্তরটি কেবল ব্যবসায় যুক্তিযুক্ত concerned
নিলস ভ্যান ডের রেস্ট

4
@ টিয়ানডিক: একটি traditionalতিহ্যবাহী স্তরযুক্ত আর্কিটেকচারে, পরিকাঠামোটি সাধারণত ডোমেন-অজোনস্টিক হয়। তবে পেঁয়াজ আর্কিটেকচারে (আমার উত্তরের লিঙ্কগুলি দেখুন) অবকাঠামো ডোমেনের বাহ্যিক নির্ভরতা প্রয়োগ করে। তবে আমি বলব না যে পরিকাঠামো ডোমেনের উপর নির্ভর করে, এটি কেবল এটির উল্লেখ করে। আমি পেঁয়াজ আর্কিটেকচার থেকে 'অবকাঠামো' শব্দটি নিয়েছি, তবে 'বাহ্যিক' আরও ভাল নাম হতে পারে।
নিলস ভ্যান ডের রেস্ট

1
@ ডেরেক: এই 'জিনিসগুলির মধ্যে একটি' ExchangeRateউদাহরণ হতে পারে , যার মধ্যে একটি বেস মুদ্রা, একটি পাল্টা মুদ্রা এবং এই দুটি মুদ্রার মধ্যে বিনিময় হারের মূল্য থাকে। এই শক্তভাবে সম্পর্কিত মানগুলি ডোমেন থেকে 'এক্সচেঞ্জ রেট' ধারণাটি উপস্থাপন করে, তাই এগুলি ডোমেন স্তরে থাকে। যদিও এটি একটি সাধারণ ডিটিওর মতো মনে হলেও ডিডিডি এটিকে একটি মান বস্তু বলা হয় এবং এটি উদাহরণগুলির সাথে তুলনা বা রূপান্তরকরণের জন্য অতিরিক্ত ব্যবসায়িক যুক্তি যুক্ত করতে পারে।
নিলস ভ্যান ডের রেস্ট

6
আপনি বিজয়ের সাথে যে অংশে একমত নন এবং কেন তা এখানে আমি একমত নই। ক্যাচিংএক্সচেঞ্জরেটস সার্ভিস একটি পরিকাঠামো উদ্বেগ। যদিও আপনি সাধারণভাবে একটি আইচাকে স্বীকার করছেন, তবুও সেই আইক্যাচের বাস্তবায়ন জড়িত প্রযুক্তির উপর নির্ভর করে (যেমন ওয়েব, উইন্ডোজ)। এটি জেনেরিকের কারণে এটি কোনও অ্যাপ্লিকেশন পরিষেবা করে না। একটি অ্যাপ্লিকেশন পরিষেবাটি আপনার ডোমেনের এপিআই। আপনি যদি অন্য কারও কাছে অ্যাপ্লিকেশন লেখার জন্য নিজের ডোমেনটি প্রকাশ করতে চান তবে তারা কী ব্যবহার করবে? অ্যাপ্লিকেশন পরিষেবাদি, এবং তাদের ক্যাশিংয়ের দরকার পড়তে পারে না যাতে আপনার ক্যাশে চালানো চালাগুলি তাদের পক্ষে অকেজো (যেমন এটি পরিকাঠামো)
অ্যারন হকিন্স

38

অ্যাপ্লিকেশন পরিষেবা এবং একটি ডোমেন পরিষেবাদির মধ্যে পার্থক্য বুঝতে আমাকে যে সেরা সংস্থানটি সহায়তা করেছিল তা হ'ল এখানে পাওয়া যায় এরিক ইভান্সের কার্গো উদাহরণটির জাভা বাস্তবায়ন । আপনি যদি এটি ডনলোড করেন তবে আপনি রাউটিংস সার্ভিস (একটি ডোমেন পরিষেবা) এবং বুকিং সার্ভিস, কারগোইনস্পেকশনসেবা (যা অ্যাপ্লিকেশন পরিষেবাদি) এর ইন্টার্নালগুলি পরীক্ষা করতে পারেন।

আমার 'আহা' মুহুর্তটি দুটি জিনিস দ্বারা ট্রিগার হয়েছিল:

  • উপরের লিঙ্কে পরিষেবাগুলির বিবরণ পড়া, আরও স্পষ্টভাবে এই বাক্যটি:

    ডোমেন পরিষেবাগুলি সর্বব্যাপী ভাষা এবং ডোমেনের ধরণের ক্ষেত্রে প্রকাশ করা হয়, যেমন পদ্ধতি আর্গুমেন্ট এবং রিটার্ন মানগুলি সঠিক ডোমেন শ্রেণি classes

  • এই ব্লগ পোস্ট পড়া , বিশেষত এই অংশ:

    কমলা থেকে আপেল আলাদা করতে আমি কী একটি বড় সাহায্য পাই তা প্রয়োগের কাজের প্রবাহের বিবেচনায় ভাবছে। অ্যাপ্লিকেশন ওয়ার্কফ্লো সম্পর্কিত সমস্ত যুক্তি সাধারণত অ্যাপ্লিকেশন পরিষেবাগুলিতে অ্যাপ্লিকেশন স্তর হিসাবে চিহ্নিত হয়ে থাকে, যদিও ডোমেনের ধারণাগুলি যা মডেল অবজেক্টগুলির মতো ফিট করে না বলে মনে হয় এক বা একাধিক ডোমেন পরিষেবাদি গঠন করে।


3
আমি সম্মত হই, আমি ঠিক এইভাবে অ্যাপ্লিকেশন পরিষেবাদি সংজ্ঞায়িত করি এবং আমি এ পর্যন্ত যে সমস্ত পরিস্থিতি পূরণ করেছি তা এটি ফিট করে fit ডোমেন পরিষেবাদিগুলি ডোমেন অবজেক্ট সম্পর্কিত সমস্ত কিছু নিয়ে কাজ করে তবে এটি একক সত্তার পরিধি ছাড়িয়ে যায়। উদাহরণস্বরূপ: BookReferencesService.GetNextAv উপলভ্য ইউনিক ট্র্যাকিং নাম্বার (), ফোকাসটি স্পষ্টভাবে ব্যবসায়ের নিয়ম। অ্যাপ্লিকেশন পরিষেবাদি সম্পর্কিত, আপনি যা বর্ণনা করেছেন ঠিক এটিই, বেশিরভাগ সময় আমি এই ব্যবসায়ের কর্মপ্রবাহকে আমার নিয়ামক ক্রিয়ায় ফেলে দিয়ে শুরু করি এবং যখন আমি এটি লক্ষ্য করি তখন আমি অ্যাপ্লিকেশন পরিষেবা স্তরটিতে এই যুক্তিটি রিফেক্টর করি। আমরা বলতে পারি যে এই স্তরটি ব্যবহারের ক্ষেত্রে
tobiak777

1
* এবং এই জাতীয় ডোমেন পরিষেবা ইন্টারফেস ডোমেন সত্তা দ্বারা গ্রাস করা হয়।
tobiak777

32

ডোমেন পরিষেবাটি ডোমেনটির সম্প্রসারণ। এটি কেবলমাত্র ডোমেনের প্রসঙ্গেই দেখা উচিত। এটি ব্যবহারকারীর কোনও ক্রিয়া নয় যেমন উদাহরণস্বরূপ ঘনিষ্ঠ অ্যাকাউন্ট বা কোনও কিছুর । ডোমেন পরিষেবা যেখানে কোনও রাজ্য নেই সেখানে ফিট করে। অন্যথায় এটি একটি ডোমেন অবজেক্ট হবে। ডোমেন পরিষেবা এমন কিছু করে যা কেবল অন্য সহযোগীদের (ডোমেন অবজেক্টস বা অন্যান্য পরিষেবাদি) সাথে কাজ করার সময়ই বোধগম্য হয়। এবং যে বোধগম্যতা অন্য স্তরের দায়িত্ব।

অ্যাপ্লিকেশন পরিষেবাটি হ'ল স্তর যা ডোমেন অবজেক্ট এবং পরিষেবাদির মধ্যে ইন্টারঅ্যাকশনকে সূচনা করে এবং তদারকি করে। প্রবাহটি সাধারণত এটির মতো: ভান্ডার থেকে ডোমেন অবজেক্ট (বা অবজেক্টস) পান, একটি ক্রিয়া সম্পাদন করুন এবং এটিকে (সেগুলি) সেখানে রেখে দিন (বা না)। এটি আরও কিছু করতে পারে - উদাহরণস্বরূপ এটি কোনও ডোমেন অবজেক্টটি বিদ্যমান কিনা তা যাচাই করতে পারে এবং সেই অনুযায়ী ব্যতিক্রম ছুঁড়ে ফেলতে পারে। সুতরাং এটি ব্যবহারকারীর সাথে অ্যাপ্লিকেশনটির সাথে ইন্টারঅ্যাক্ট করতে দেয় (এবং এটি সম্ভবত এটির নাম থেকেই উদ্ভূত হয়) - ডোমেন অবজেক্ট এবং পরিষেবাদিগুলি পরিচালনা করে। অ্যাপ্লিকেশন পরিষেবাগুলি সাধারণত সমস্ত সম্ভাব্য ব্যবহারের ক্ষেত্রে প্রতিনিধিত্ব করে। সম্ভবত আপনি ডোমেন সম্পর্কে চিন্তা করার আগে সবচেয়ে ভাল কাজটি হ'ল অ্যাপ্লিকেশন পরিষেবা ইন্টারফেস তৈরি করা যা আপনাকে সত্যিকার অর্থে যা করার চেষ্টা করছেন তাতে আপনাকে আরও ভাল অন্তর্দৃষ্টি দেবে। এই ধরনের জ্ঞান থাকা আপনাকে ডোমেনে ফোকাস করতে সক্ষম করে।

সংগ্রহস্থলগুলিতে সাধারণত ডোমেন পরিষেবাগুলিতে ইনজেকশন দেওয়া যায় তবে এটি বিরল দৃশ্য। এটি অ্যাপ্লিকেশন স্তর যিনি বেশিরভাগ সময় এটি করেন।


10
"যেখানে কোনও রাষ্ট্র নেই সেখানে ডোমেন পরিষেবা ফিট করে Otherwise অন্যথায় এটি একটি ডোমেন অবজেক্ট হবে।" এটি আমার জন্য ক্লিক করুন। ধন্যবাদ.
নিক

31

রেড বুক থেকে (ভন ভার্নন রচিত ইমপ্লিমেন্টিং ডোমেন ড্রাইভড ডিজাইন), আমি এই ধারণাগুলি বুঝতে পারি:

ডোমেন অবজেক্টস ( সত্তা এবং মান অবজেক্টস ) (সাব) ডোমেনের দ্বারা প্রয়োজনীয় আচরণকে এনপ্যাপুলেট করে, এটি প্রাকৃতিক, ভাবপ্রবণ এবং বোধগম্য করে তোলে।

ডোমেন পরিষেবাদি এমন আচরণগুলিকে আবদ্ধ করে যা কোনও একক ডোমেন অবজেক্টে খাপ খায় না । উদাহরণস্বরূপ, কোনও বইয়ের গ্রন্থাগারটি Bookকোনও Client( Inventorychanges ণ সম্পর্কিত পরিবর্তনগুলি সহ) le ণ দিতে পারে এটি কোনও ডোমেন পরিষেবা থেকে করতে পারে।

অ্যাপ্লিকেশন পরিষেবাগুলি ডোমেনের শীর্ষে প্রয়োজনীয় কোনও অতিরিক্ত উদ্বেগ সহ, ব্যবহারের ক্ষেত্রে প্রবাহ পরিচালনা করে । এটি প্রায়শই বহিরাগত ক্লায়েন্টদের ব্যবহারের জন্য এটির API এর মাধ্যমে এ জাতীয় পদ্ধতি প্রকাশ করে। আমাদের আগের উদাহরণটি তৈরি করতে, আমাদের অ্যাপ্লিকেশন পরিষেবাটি এমন কোনও পদ্ধতি উন্মোচন করতে পারে LendBookToClient(Guid bookGuid, Guid clientGuid)যা:

  • পুনরুদ্ধার করে Client
  • এর অনুমতিগুলি নিশ্চিত করে। ( নোট করুন কীভাবে আমরা সুরক্ষা / ব্যবহারকারী পরিচালনার উদ্বেগ থেকে আমাদের ডোমেন মডেলটি রেখেছি Such এই জাতীয় দূষণ অনেক সমস্যার কারণ হতে পারে Instead পরিবর্তে, আমরা আমাদের প্রযুক্তি পরিষেবাদিতে এই প্রযুক্তিগত প্রয়োজনীয়তাটি এখানে পূরণ করি ))
  • পুনরুদ্ধার করে Book
  • ক্লায়েন্টকে বই ndingণ দেওয়ার আসল ডোমেন যুক্তি পরিচালনা করার জন্য ডোমেন পরিষেবা ( Clientএবং পাসিং Book) কল করে । উদাহরণস্বরূপ, আমি কল্পনা করি যে বইয়ের সহজলভ্যতা নিশ্চিত করা অবশ্যই ডোমেন যুক্তির অংশ।

একটি অ্যাপ্লিকেশন পরিষেবাটিতে সাধারণত খুব সাধারণ প্রবাহ থাকা উচিত। জটিল অ্যাপ্লিকেশন পরিষেবা প্রবাহটি প্রায়শই নির্দেশ করে যে ডোমেন যুক্তিটি ডোমেনের বাইরে চলে গেছে।

আপনি যেমন আশাবাদী দেখতে পাচ্ছেন, ডোমেন মডেলটি এইভাবে খুব পরিষ্কার থাকে এবং ডোমেন বিশেষজ্ঞদের সাথে এটি বোঝা এবং আলোচনা করা সহজ, কারণ এতে কেবল তার নিজস্ব, প্রকৃত ব্যবসায়ের উদ্বেগ রয়েছে। আবেদন প্রবাহ অন্যদিকে হল এছাড়াও অনেক পরিচালনা করা সহজ, যেহেতু এটি ডোমেইন উদ্বেগ অব্যাহতি হয়, এবং সংক্ষিপ্ত, এবং সহজবোধ্য হয়ে ওঠে।


2
আমি বলব যে অ্যাপ্লিকেশন পরিষেবাটি এমন একটি পয়েন্ট যেখানে নির্ভরতাগুলি সমাধান করা হয়। এর পদ্ধতিটি ব্যবহারের ক্ষেত্রে, একটি একক প্রবাহ, তাই এটি ব্যবহারের জন্য কংক্রিট বাস্তবায়নের বিষয়ে অবগত সিদ্ধান্ত নিতে পারে। ডাটাবেস লেনদেনের পাশাপাশি এখানে মাপসই।
টিমো

10

ডোমেন পরিষেবাদি: যে পদ্ধতিগুলি সত্যই কোনও একক সত্তার সাথে খাপ খায় না বা সংগ্রহস্থলের অ্যাক্সেসের প্রয়োজন তা ডোমেন পরিষেবাদির মধ্যে অন্তর্ভুক্ত থাকে। ডোমেন পরিষেবা স্তরটিতে নিজস্ব ডোমেন যুক্তিও থাকতে পারে এবং এটি ডোমেন মডেলের অনেক অংশ যেমন সত্তা এবং মান বস্তু।

অ্যাপ্লিকেশন পরিষেবা: অ্যাপ্লিকেশন পরিষেবাটি একটি পাতলা স্তর যা ডোমেন মডেলের উপরে বসে এবং অ্যাপ্লিকেশন ক্রিয়াকলাপকে সমন্বয় করে। এতে ব্যবসায়িক যুক্তি থাকে না এবং কোনও সংস্থার স্থিতি থাকে না; তবে এটি ব্যবসায়ের কর্মপ্রবাহের লেনদেনের রাজ্য সংরক্ষণ করতে পারে। অনুরোধ-উত্তর মেসেজিং প্যাটার্নটি ব্যবহার করে আপনি ডোমেন মডেলটিতে একটি API সরবরাহ করতে একটি অ্যাপ্লিকেশন পরিষেবা ব্যবহার করেন।

মিললেট, সি (২০১০) পেশাদার এএসপি.এনইটি ডিজাইনের প্যাটার্নস। উইলে পাবলিশিং। 92।


6

ডোমেন পরিষেবাদি : এমন পরিষেবা যা কোনও ব্যবসায় যুক্তি প্রকাশ করে যা কোনও সমষ্টিগত রুটের অংশ নয়।

  • আপনার কাছে 2 সমষ্টি রয়েছে:

    • Product যার মধ্যে নাম এবং দাম রয়েছে।
    • Purchase যার ক্রয়ের তারিখ, সেই সময় পরিমাণ এবং পণ্যমূল্যের সাথে অর্ডার করা পণ্যগুলির তালিকা এবং অর্থ প্রদানের পদ্ধতি রয়েছে।
  • Checkout এই দুটি মডেলের কোনওটিরই অংশ নয় এবং এটি আপনার ব্যবসায়ের ধারণা।

  • Checkoutএকটি ডোমেন পরিষেবা হিসাবে তৈরি করা যেতে পারে যা সমস্ত পণ্য নিয়ে আসে এবং মোট মূল্য গণনা করে, PaymentServiceঅবকাঠামোর একটি বাস্তবায়নের অংশের সাথে অন্য একটি ডোমেন পরিষেবা কল করে মোট অর্থ প্রদান করে এবং এতে রূপান্তর করে Purchase

অ্যাপ্লিকেশন পরিষেবাদি : একটি পরিষেবা যা "অর্কেস্টেটে" বা ডোমেন পদ্ধতিগুলি অনুশীলন করে। এটি আপনার কন্ট্রোলারের মতোই সহজ হতে পারে।

এটি সেই জায়গা যেখানে আপনি সাধারণত:

public String createProduct(...some attributes) {
  if (productRepo.getByName(name) != null) {
    throw new Exception();
  }

  productId = productRepository.nextIdentity();

  product = new Product(productId, ...some attributes);

  productRepository.save(product);

  return productId.value();
  // or Product itself
  // or just void if you dont care about result
}

public void renameProduct(productId, newName) {
  product = productRepo.getById(productId);

  product.rename(newName);

  productRepo.save(product);
}

আপনি এখানে বৈধতা যাচাই করতে পারেন Productযেমন কোনও অনন্য কিনা তা পরীক্ষা করা । Productঅদ্বিতীয় না হলে আক্রমণকারী না হলে ডোমেন সেবার অংশ হওয়া উচিত যা বলা যেতে পারে UniqueProductCheckerকারণ এটি Productশ্রেণীর অংশ হতে পারে না এবং এটি একাধিক সমষ্টিগুলির সাথে ইন্টারেক্ট করে।

এখানে ডিডিডি প্রকল্পের পূর্ণ বিকাশের উদাহরণ রয়েছে: https://github.com/VaughnVernon/IDDD_S উদাহরণ

আপনি অ্যাপ্লিকেশন পরিষেবা এবং ডোমেন পরিষেবাদির একটি দম্পতির প্রচুর উদাহরণ খুঁজে পেতে পারেন


কেবলমাত্র অ্যাপ্লিকেশন পরিষেবাগুলিতে সত্তাগুলি বৈধকরণ এবং সংরক্ষণ করা বাধ্যতামূলক? আমার যদি A, B এবং C সত্তা রয়েছে এবং সেগুলির একে অপরের সাথে সম্পর্কিত (এ -> বি -> সি) এবং এ-এর ক্রিয়াকলাপের ফলে অন্য এবং একটি ডোমেন পরিষেবা কল করে বি এবং সি পরিবর্তন করা উচিত, কীভাবে এটি করা যায়?
MrNVK

> কেবলমাত্র অ্যাপ্লিকেশন পরিষেবাতে সত্তাগুলি বৈধকরণ এবং সংরক্ষণ করা বাধ্যতামূলক? যদি আপনার হয়, তবে হ্যাঁ। বেশিরভাগ সময় আপনাকে আইডি আছে কিনা তা পরীক্ষা করে দেখতে হবে কারণ অন্যথায় আপনি নাল ভেরিয়েবলের উপর কাজ করবেন।
donotmatter

1
> আমার কাছে যদি ক, খ ও সি রয়েছে এবং এগুলির সমস্ত একে অপরের সাথে সম্পর্কিত (এ -> বি -> সি) এবং এ-এর ক্রিয়াকলাপের ফলে অন্য এবং একটি ডোমেন পরিষেবা কল করে বি এবং সি পরিবর্তন করা উচিত, কীভাবে এটি করা যায় ? "অন্যের থেকে একটি ডোমেন পরিষেবা কল করে" আপনি কী বোঝাতে চেয়েছেন তা আমি নিশ্চিত নই, তবে কোনও সত্তার পরিবর্তনের প্রতিক্রিয়ার জন্য আপনি ইভেন্টগুলি ব্যবহার করতে পারেন বা কেবল অ্যাপ্লিকেশন পরিষেবাটির মাধ্যমে অর্কস্ট্রেট করতে পারেন যেমন: aggregateA.doOperation (), aggregateB.doAnother ( )। অনুসন্ধান করুন: অর্কেস্ট্রেশন বনাম কোরিওগ্রাফি
ননমেটার

উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ! "অন্যের কাছ থেকে একটি ডোমেন পরিষেবা কল করা" - মানে, সত্তা A তে আমার যদি কোনও জটিল অপারেশন হয়, তবে আমাকে অ্যাডোমাইনসেসওয়ার ব্যবহার করতে হবে। কিন্তু এই অপারেশনটি, সত্তা A ছাড়াও সত্তা বিকে প্রভাবিত করে oma এডোমাইনস সার্ভিসে সত্তা বিতে যে অপারেশন করা আবশ্যক তাও জটিল। সুতরাং আমাকে এডোমাইনসোসার্ভিস থেকে বিডোমেনসেসওয়ারি ব্যবহার করতে হবে। এখন আমি এই পদ্ধতির বিষয়ে সন্দেহ করছি :) তবে আমি যদি এই যুক্তিটি অ্যাপ্লিকেশনসেবারে রাখি, তবে এটি কি ব্যবসায়ের প্রক্রিয়াগুলির কেবলমাত্র অ্যাপ্লিকেশন স্তরে নয়, ডোমেন স্তরে থাকা উচিত নয়?
MrNVK

আপনি যদি মনে করেন যে এটি অ্যাপ্লিকেশন পরিষেবার পরিবর্তে কোনও ডোমেন পরিষেবাতে হওয়া উচিত তবে আপনি কেবল আপনার ডোমেন পরিষেবা থেকে ইভেন্টটি ছড়িয়ে দিতে পারেন।
নোটম্যাটার

0

ডোমেন পরিষেবাটিকে এমন একটি বিষয় হিসাবে ভাবুন যা ডোমেইন অবজেক্টগুলিতে ব্যবসায়িক যুক্তি বা ব্যবসায়ের নিয়ম সম্পর্কিত যুক্তিকে কার্যকর করে এবং এই যুক্তিটি একই ডোমেন অবজেক্টগুলিতে ফিট করা কঠিন এবং ডোমেন পরিষেবাটির রাষ্ট্রীয় পরিবর্তনের কারণও তৈরি করে না (ডোমেন পরিষেবা ব্যতীত কোনও বস্তু নয় একটি "রাষ্ট্র" বা একটি ব্যবসায়ের অর্থ রয়েছে এমন রাষ্ট্র ব্যতীত আরও ভাল) তবে শেষ পর্যন্ত কেবলমাত্র সেই ডোমেন অবজেক্টগুলিকেই চালিত করে যার উপরে কাজ করে।

যদিও কোনও অ্যাপ্লিকেশন পরিষেবা ব্যবহারকারীর ইন্টারঅ্যাকশন, ইনপুট বৈধকরণ, যুক্তি ব্যবসায়ের সাথে সম্পর্কিত নয় তবে অন্যান্য উদ্বেগের সাথে প্রয়োগ করে: যেমন ডোমেন অবজেক্টের দ্বারা উদ্ভাসিত পরিষেবাদি ব্যবহার করতে নিজেকে সীমাবদ্ধ করে।

এর উদাহরণটি কেবলমাত্র উদ্দেশ্য ব্যাখ্যা করার জন্য নীচের দৃশ্যে বিবেচনা করা যেতে পারে: আমাদের একটি খুব সামান্য ডোমোটিক ইউটিলিটি অ্যাপ্লিকেশন প্রয়োগ করতে হবে যা একটি সাধারণ অপারেশন চালায়, এটি "লাইটগুলি চালু করুন, যখন কেউ বাড়ির ঘরের দরজা প্রবেশ করার জন্য খোলে is ঘর থেকে দরজাটি বন্ধ হয়ে যাওয়ার সময় প্রবেশ করুন এবং লাইটটি বন্ধ করুন "।

অনেক আমরা কেবল 2 ডোমেইন সত্ত্বা বিবেচনা সরলীকৃত: Doorএবং Lamp, তাদের প্রতিটি 2 রাজ্যের respectevely হয়েছে open/closedএবং on/off, এবং নির্দিষ্ট তাদের উপর রাষ্ট্র পরিবর্তন কাজ চালানোর জন্য পদ্ধতি।

এই ক্ষেত্রে আমাদের একটি ডোমেন পরিষেবা দরকার যা কোনও ঘরে প্রবেশের জন্য বাইরের দিক থেকে দরজা খোলার সময় আলোর উপরের সুনির্দিষ্ট ক্রিয়াকলাপ সম্পাদন করে, কারণ দরজা এবং প্রদীপের অবজেক্টগুলি আমাদের যুক্তিগুলি এমনভাবে প্রয়োগ করতে পারে না যেভাবে আমরা উপযুক্ত বিবেচনা করি তাদের প্রকৃতি

আমরা একটি ডোমেইন সেবা কল করতে পারেন DomoticDomainServiceএবং 2 পদ্ধতি বাস্তবায়ন: OpenTheDoorAndTurnOnTheLightএবং CloseTheDoorAndTurnOffTheLight, এই 2 পদ্ধতি respectevely উভয় বস্তু অবস্থা পরিবর্তন Doorএবং Lampকরতে open/onএবং closed/off

কোনও ঘর থেকে প্রবেশ বা প্রস্থানের অবস্থাটি এটি ডোমেন পরিষেবা অবজেক্টে বা ডোমেন অবজেক্টগুলিতে উপস্থিত নয়, তবে কোনও অ্যাপ্লিকেশন পরিষেবা দ্বারা সাধারণ ব্যবহারকারীর ইন্টারঅ্যাকশন হিসাবে প্রয়োগ করা হবে, যা আমরা কল করতে পারি HouseService, যা কিছু ইভেন্ট হ্যান্ডলারকে প্রয়োগ করে onOpenRoom1DoorToEnterএবং onCloseRoom1DoorToExit, এবং আরও প্রতিটি ঘরের জন্য (এটি উদ্দেশ্য ব্যাখ্যা করার জন্য কেবল একটি উদাহরণ ..) , যা যথাক্রমে উপস্থিত আচরণটি সম্পাদন করার জন্য কল ডোমেন পরিষেবা পদ্ধতিগুলি সম্পর্কে উদ্বেগ প্রকাশ করবে (আমরা সত্তাকে বিবেচনা করি নি Roomকারণ এটি কেবলমাত্র একটি উদাহরণ)

এই উদাহরণটি, এখনও একটি ভাল ডিজাইন করা সত্যিকারের বিশ্ব অ্যাপ্লিকেশন হিসাবে, একটি ডোমেন পরিষেবা কী এবং কোনও অ্যাপ্লিকেশন পরিষেবা থেকে তার পার্থক্য ব্যাখ্যা করার একমাত্র উদ্দেশ্য (যত বেশিবার বলা হয়েছে) রয়েছে, আশা করি এটি পরিষ্কার এবং কার্যকর।


সিরো: আপনার উদাহরণটি ব্যবহারিক নয় এবং এটি খুব বিভ্রান্তিকর।
মরতেজা আজিজি

হাই মোর্তিজা, আপনি আরও নির্দিষ্ট হতে পারে? আপনার সত্যিকারের যুক্তি ছাড়াই কেবল "রায়" হওয়ার ঝুঁকি রয়েছে। আপনাকে ধন্যবাদ
সিওরো কর্ভিনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.