প্রশ্ন থেকে পরিভাষাটি উদাহরণ কোডের সাথে সত্যিই মেলে না। Ambient Context
সম্ভব হিসাবে সহজ কোন মডিউল কোনো ক্লাস থেকে নির্ভরশীলতার দখল করতে নির্ভরতা ইন্টারফেস গ্রহণ করতে প্রত্যেক বর্গ দূষণ, কিন্তু এখনও নিয়ন্ত্রণের বিপর্যয় ধারণা পালন ছাড়া ব্যবহার করা একটি প্যাটার্ন নেই। এই ধরনের নির্ভরতা সাধারণত লগিং, সুরক্ষা, সেশন ম্যানেজমেন্ট, লেনদেন, ক্যাশিং, নিরীক্ষার জন্য নিবেদিত থাকে যাতে অ্যাপ্লিকেশনটির যে কোনও ক্রস কাটা উদ্বেগ থাকে। এটি একটি যোগ করার জন্য একরকম বিরক্তিকর ILogging
, ISecurity
, ITimeProvider
কনস্ট্রাকটর প্রয়োজন এবং অধিকাংশ সময় সব শ্রেণীর একই সময়ে সব প্রয়োজন, আমি আপনার প্রয়োজন বুঝতে তাই।
ISession
উদাহরণস্বরূপ যদি তার জীবনকাল ILogger
একরকম হয় তবে কী হবে? হয়ত প্রতিটি অনুরোধে আইসেশন দৃষ্টান্তটি তৈরি করা উচিত এবং একবার আইলোগার। সুতরাং এই সমস্ত নির্ভরতা একটি পাত্রের দ্বারা চালিত যা নিজেই ধারক নয় এটি সঠিক পছন্দ বলে মনে হয় না কারণ এই সমস্ত সমস্যার কারণে আজীবন পরিচালন এবং স্থানীয়করণ এবং এই থ্রেডে বর্ণিত অন্যরা এই সমস্যাগুলি দেখায়।
IAmbientContext
প্রশ্নে যে কন্সট্রাকটর দূষণ না সমস্যা সমাধানের নেই। আপনাকে এখনও এটি নির্মাণকারীর স্বাক্ষরে ব্যবহার করতে হবে, অবশ্যই, এই সময়টি কেবল একবার।
সুতরাং সবচেয়ে সহজ উপায় ক্রস কাটিয়া নির্ভরতা মোকাবেলায় কনস্ট্রাক্টর ইনজেকশন বা অন্য কোনও ইনজেকশন ব্যবস্থা ব্যবহার না করা, তবে একটি স্ট্যাটিক কল ব্যবহার করা । আমরা এই প্যাটার্নটি বেশিরভাগ ক্ষেত্রেই দেখতে পাই, এটি ফ্রেমওয়ার্ক নিজেই প্রয়োগ করে। থ্রেড পরীক্ষা করুন। বর্তমান প্রিন্সিপাল যা একটি স্থিতিশীল সম্পত্তি যা IPrincipal
ইন্টারফেসের একটি বাস্তবায়ন ফিরিয়ে দেয় । এটিও স্থিরযোগ্য যাতে আপনি যদি এটি পছন্দ করেন তবে প্রয়োগটি পরিবর্তন করতে পারেন, সুতরাং আপনি এটির সাথে মিলিত হন না।
MyCore
দেখতে এখন এরকম কিছু something
public class MyCoreClass
{
public void BusinessFeature(string data)
{
LoggerContext.Current.Log(data);
_repository.SaveProcessedData();
SessionContext.Current.SetData(data);
...etc
}
}
এই প্যাটার্ন এবং সম্ভব বাস্তবায়নের বিস্তারিত মার্ক Seemann দ্বারা বর্ণিত হয়েছে এই নিবন্ধটি । এমন কোনও বাস্তবায়ন হতে পারে যা আপনি নিজেরাই ব্যবহার করেন আইওসি ধারকটির উপর নির্ভর করে।
আপনি এড়াতে চান AmbientContext.Current.Logger
, AmbientContext.Current.Session
একই কারণে উপরে বর্ণিত।
তবে এই সমস্যাটি সমাধান করার জন্য আপনার কাছে অন্য বিকল্প রয়েছে: আপনার ধারকটির যদি এই ক্ষমতা বা এওপি থাকে তবে সজ্জকার, গতিশীল বাধা ব্যবহার করুন। এর ক্লায়েন্টরা এর মাধ্যমে তাদের নির্ভরতা আড়াল করে রাখার কারণে পরিবেষ্টনীয় প্রসঙ্গটি শেষ অবলম্বন হওয়া উচিত। আমি এখনও যদি ইন্টারফেস এটা সত্যিই নকল আমার প্রৈতি মত একটি স্ট্যাটিক নির্ভরতা ব্যবহার করতে বায়ুমণ্ডলের কনটেক্সট ব্যবহার করেন DateTime.Now
বা ConfigurationManager.AppSettings
করতে এবং এই প্রয়োজন বেশ প্রায়ই উত্থাপন। তবে শেষ পর্যন্ত এই সর্বব্যাপী নির্ভরতা পেতে কনস্ট্রাক্টর ইঞ্জেকশনটি কোনও খারাপ ধারণা নাও হতে পারে।
IService
অন্য পরিষেবার সাথে যোগাযোগের জন্য কী ব্যবহৃত হয়?" যদিIService
অন্য পরিষেবায় কোনও অস্পষ্ট নির্ভরতা উপস্থাপন করে তবে এটি কোনও পরিষেবা লোকেটারের মতো শোনাচ্ছে এবং এর অস্তিত্ব থাকা উচিত নয়। আপনার শ্রেণীর ইন্টারফেসের উপর নির্ভর করা উচিত যা তাদের গ্রাহকরা তাদের সাথে কী করবে তা স্পষ্টভাবে বর্ণনা করে। কোনও শ্রেণিতে কোনও পরিষেবায় অ্যাক্সেস সরবরাহের জন্য কোনও পরিষেবার প্রয়োজন নেই। একটি শ্রেণীর একটি নির্ভরতা প্রয়োজন যা শ্রেণীর প্রয়োজনীয় কিছু নির্দিষ্ট করে।