নিয়ন্ত্রকের পক্ষে সরাসরি একটি সংগ্রহস্থল কল করা খারাপ অভ্যাস নয়। একটি "পরিষেবা" হ'ল অন্য একটি সরঞ্জাম, সুতরাং এটি যেখানে এটি বোধগম্য তা ব্যবহার করুন।
নিকোলাইড্যান্ট মন্তব্য করেছেন:
... সঠিক প্রয়োগের জন্য সঠিক প্যাটার্নটি চয়ন করুন। আমি যা বলব তা হ'ল আপনার আবেদনটি সামঞ্জস্য করা উচিত।
আমি মনে করি না ধারাবাহিকতা সবচেয়ে গুরুত্বপূর্ণ দিক। একটি "পরিষেবা" শ্রেণি বোঝানো হয় কিছু উচ্চ স্তরের যুক্তি সজ্জিত করা যাতে নিয়ামককে এটি প্রয়োগ করার প্রয়োজন হয় না। যদি কোনও প্রদত্ত ক্রিয়াকলাপের জন্য "উচ্চ স্তরের যুক্তি" প্রয়োজন না হয় তবে সরাসরি সংগ্রহস্থলে যান।
কনসার্নস এবং টেস্টিবিলিটির ভাল পৃথক পৃথক প্রচারের জন্য, সংগ্রহস্থলটি কোনও কনস্ট্রাক্টরের মাধ্যমে পরিষেবাতে আপনি ইনজেকশনের নির্ভরতা হওয়া উচিত:
IFooRepository repository = new FooRepository();
FooService service = new FooService(repository);
service.DoSomething(...);
যদি ডাটাবেসে রেকর্ড অনুসন্ধানের জন্য কিছু প্রকারের প্যারামিটারাইজড ক্যোয়ারী দরকার হয় তবে কোনও সার্ভিস ক্লাস আপনার ভিউ মডেলটি নিতে এবং কোনও কোয়েরি তৈরি করতে ভাল জায়গা হতে পারে যা সংগ্রহস্থল দ্বারা কার্যকর করা হয়।
একইভাবে, যদি কোনও ফর্মের জন্য আপনার কাছে জটিল ভিউ মডেল থাকে তবে কোনও পরিষেবা শ্রেণি আপনার ডোমেন মডেল / সত্তাগুলিতে পদ্ধতিগুলি কল করে রেকর্ড তৈরি, আপডেট এবং মুছে ফেলার যুক্তিকে আবদ্ধ করতে পারে, তারপরে সেগুলি একটি সংগ্রহস্থল ব্যবহার করে চালিয়ে যায়।
বিপরীত দিকে যেতে, যদি আপনার নিয়ামককে তার আইডির মাধ্যমে কোনও রেকর্ড পেতে হয়, তবে এর জন্য কোনও পরিষেবা সামগ্রীর কাছে অর্পণ করা স্লেজহ্যামার দিয়ে থাম্বট্যাক মারার মতো - এটি আপনার প্রয়োজনের চেয়ে অনেক বেশি উপায়।
আমি দেখেছি যে নিয়ামক সেরা অবস্থানে লেনদেন, অথবা একটি হ্যান্ডেল করতে হয় ওয়ার্ক বস্তুর ইউনিট । নিয়ামক বা ইউনিট অফ ওয়ার্ক অবজেক্টটি তখন জটিল ক্রিয়াকলাপগুলির জন্য পরিষেবা বস্তুগুলিকে অর্পণ করত, বা সাধারণ ক্রিয়াকলাপের জন্য সরাসরি সংগ্রহস্থলে যান (আইডির মাধ্যমে রেকর্ড সন্ধান করার মতো)।
public class ShoppingCartsController : Controller
{
[HttpPost]
public ActionResult Edit(int id, ShoppingCartForm model)
{
// Controller initiates a database session and transaction
using (IStoreContext store = new StoreContext())
{
// Controller goes directly to a repository to find a record by Id
ShoppingCart cart = store.ShoppingCarts.Find(id);
// Controller creates the service, and passes the repository and/or
// the current transaction
ShoppingCartService service = new ShoppingCartService(store.ShoppingCarts);
if (cart == null)
return HttpNotFound();
if (ModelState.IsValid)
{
// Controller delegates to a service object to manipulate the
// Domain Model (ShoppingCart)
service.UpdateShoppingCart(model, cart);
// Controller decides to commit changes
store.SaveChanges();
return RedirectToAction("Index", "Home");
}
else
{
return View(model);
}
}
}
}
আমি মনে করি পরিষেবাগুলির মিশ্রণ এবং সরাসরি সংগ্রহস্থলগুলির সাথে কাজ করা পুরোপুরি গ্রহণযোগ্য। আপনি যদি প্রয়োজনীয়তা অনুভব করেন তবে আপনি লেনদেনটিকে একটি ইউনিট অফ ওয়ার্ক অবজেক্টে সজ্জিত করতে পারেন।
দায়িত্বের ভাঙ্গন এইভাবে চলে:
- নিয়ামক অ্যাপ্লিকেশনটির প্রবাহ নিয়ন্ত্রণ করে
- শপিং কার্ট ডাটাবেসে না থাকলে "404 পাওয়া যায় না" ফেরত দেয়
- বৈধতা ব্যর্থ হলে ফর্মটি বৈধতা বার্তার সাথে পুনরায় রেন্ডার করে
- সবকিছু চেক আউট হলে শপিং কার্ট সংরক্ষণ করে
- আপনার ডোমেন মডেলগুলিতে (বা সত্তা) ব্যবসায়িক যুক্তি সম্পাদন করতে নিয়ামক কোনও পরিষেবা শ্রেণিতে প্রতিনিধি। পরিষেবা অবজেক্টগুলি ব্যবসায়ের যুক্তি বাস্তবায়ন করা উচিত নয় ! তারা ব্যবসায়িক যুক্তি কার্যকর করে ।
- কন্ট্রোলাররা সাধারণ ক্রিয়াকলাপের জন্য সরাসরি সংগ্রহস্থলগুলিতে প্রতিনিধি দিতে পারে
- পরিষেবা অবজেক্টগুলি ভিউ মডেলটিতে ডেটা নেয় এবং ব্যবসায়িক যুক্তি সম্পাদনের জন্য ডোমেন মডেলগুলিকে ডেলিগেট দেয় (যেমন, সার্ভিস অবজেক্টটি ডোমেন মডেলগুলিতে সংগ্রহস্থলের পদ্ধতিতে কল করার আগে পদ্ধতিগুলি কল করে)
- ডেটা অধ্যবসায়ের জন্য পরিষেবা অবজেক্টাগুলি ভান্ডারগুলিতে প্রেরণ করে
- নিয়ন্ত্রকদের উচিত:
- কোনও লেনদেনের আজীবন পরিচালনা করুন, বা
- কোনও লেনদেনের আজীবন পরিচালনা করতে ইউনিটের একটি ইউনিট তৈরি করুন