আমি আপনার পয়েন্টগুলি সংখ্যাসূচকভাবে যাব, তবে প্রথমে, এমন কিছু বিষয় যা আপনার সম্পর্কে খুব সতর্ক হওয়া উচিত: গ্রাহক কীভাবে গ্রন্থাগারটি কার্যকর করা হয় তার সাথে কোনও গ্রন্থাগার কীভাবে ব্যবহার করবেন তা নিয়ে দ্বন্দ্ব করবেন না । এর ভাল উদাহরণ হ'ল এনটিটি ফ্রেমওয়ার্ক (যা আপনি নিজেরাই একটি ভাল গ্রন্থাগার হিসাবে উল্লেখ করেছেন) এবং এএসপি.নেটের এমভিসি। এগুলি উভয়ই হুডের নীচে একটি ভয়ঙ্কর কাজ করে, উদাহরণস্বরূপ, প্রতিবিম্ব, যা আপনি এটি দিন-দিনের কোডের মাধ্যমে ছড়িয়ে দিলে একেবারে ভাল নকশা হিসাবে বিবেচিত হবে না।
এই লাইব্রেরিগুলি তারা কীভাবে কাজ করে বা পর্দার আড়ালে তারা কী করছে তাতে একেবারে "স্বচ্ছ" নয় । তবে এটি কোনও ক্ষতি নয়, কারণ তারা তাদের গ্রাহকদের ভাল প্রোগ্রামিং নীতি সমর্থন করে । সুতরাং আপনি যখনই এই জাতীয় লাইব্রেরি সম্পর্কে কথা বলবেন তখন মনে রাখবেন যে কোনও গ্রন্থাগারের গ্রাহক হিসাবে, এটির প্রয়োগ বা রক্ষণাবেক্ষণ সম্পর্কে চিন্তা করা আপনার কাজ নয়। আপনার কেবল কেবল এটিই চিন্তা করা উচিত যা এটি আপনার যে কোডটি গ্রন্থাগার ব্যবহার করে তাতে কীভাবে সহায়তা করে বা বাধা দেয়। এই ধারণাগুলি মিলে না!
সুতরাং, পয়েন্ট দ্বারা যেতে:
তাত্ক্ষণিকভাবে আমরা পৌঁছে যা আমি কেবল ধরে নিতে পারি উপরের উদাহরণ। আপনি বলছেন যে আইওসি পাত্রে স্থির হিসাবে সর্বাধিক নির্ভরতা সেট আপ হয়। ওয়েল, সম্ভবত তারা কীভাবে কাজ করে তার কিছু বাস্তবায়নের বিশদ স্ট্যাটিক স্টোরেজ অন্তর্ভুক্ত করে (যদিও তাদের দেওয়া আছে যে তারা নিিনজেক্টের মতো কোনও বস্তুর উদাহরণ IKernel
হিসাবে তাদের মূল স্টোরেজ হিসাবে রয়েছে, আমি সে সম্পর্কেও সন্দেহ করি)। তবে এটি আপনার উদ্বেগ নয়!
আসলে, কোনও আইওসি পাত্রে দরিদ্র লোকের নির্ভরতা ইনজেকশন হিসাবে স্কোপের সাথে ঠিক তেমন স্পষ্ট। (আমি আইওসি পাত্রে তুলনামূলকভাবে দরিদ্র ব্যক্তির ডিআই এর সাথে তুলতে চলেছি কারণ তাদের কোনও ডিআইয়ের সাথে তুলনা করা অন্যায় এবং বিভ্রান্তিকর হবে And
দরিদ্র মানুষের ডিআইতে, আপনি ম্যানুয়ালি একটি নির্ভরতা ইনস্ট্যান্ট করতে চান, তারপরে এটির প্রয়োজনীয় ক্লাসে এটি ইনজেক্ট করুন। আপনি যে নির্ভরতাটি তৈরি করেন সেই স্থানে আপনি কী করবেন তা বেছে নেবেন- এটি স্থানীয়ভাবে স্কোপড ভেরিয়েবল, ক্লাস ভেরিয়েবল, একটি স্ট্যাটিক ভেরিয়েবলে সংরক্ষণ করুন, যা কিছু হোক না কেন এটি সংরক্ষণ করবেন না। আপনি একই ক্লাসটি প্রচুর ক্লাসে পাস করতে পারেন বা আপনি প্রতিটি শ্রেণীর জন্য একটি নতুন তৈরি করতে পারেন। যাই হোক. মুল বক্তব্যটি হচ্ছে, যা ঘটছে তা দেখার জন্য আপনি সেই বিন্দুটির দিকে নজর রাখবেন- সম্ভবত অ্যাপ্লিকেশন রুটের কাছাকাছি- যেখানে নির্ভরতা তৈরি হয়েছে।
এখন আইওসি পাত্রে কী হবে? ঠিক আছে, আপনি ঠিক একই কাজ! আবার, Ninject পরিভাষা দ্বারা যাচ্ছে, তুমি কোথায় বাঁধাই সেট আপ করা হয়েছে তাকান, এবং এটি কিনা এটা বলে কিছু InTransientScope
, InSingletonScope
বা যাই হোক না কেন। যদি এটি কোনও কিছু সম্ভাব্যভাবে পরিষ্কার হয় তবে কারণ আপনার কোনও কোডের সাথে তার ব্যাপ্তিটি ঘোষণা করার ঠিক আছে, কারণ কোনও বস্তুর কী ঘটেছিল তা ট্র্যাক করার জন্য কোনও পদ্ধতির সন্ধানের চেয়ে (কোনও বস্তু একটি ব্লকে বিভক্ত হতে পারে, তবে এটি এতে একাধিকবার ব্যবহৃত হয়েছে) ব্লক করুন বা কেবল একবার, উদাহরণস্বরূপ)। সুতরাং আপনি স্কোপ লেখার জন্য কোনও কাঁচা ভাষার বৈশিষ্ট্য না দিয়ে আইওসি পাত্রে কোনও বৈশিষ্ট্য ব্যবহার করার ধারণার দ্বারা আপনি প্রত্যাখ্যান করেছেন, তবে যতক্ষণ আপনি আপনার আইওসি লাইব্রেরিতে বিশ্বাস করেন - যা আপনার করা উচিত! - এটির কোনও প্রকৃত অসুবিধা নেই there's ।
আপনি এখানে কী বিষয়ে কথা বলছেন তা আমি এখনও জানি না। আইওসি পাত্রে তাদের অভ্যন্তরীণ বাস্তবায়নের অংশ হিসাবে ব্যক্তিগত সম্পত্তিগুলি কী দেখছেন? তারা কেন করবে তা আমি জানি না, তবে তারা যদি তা করে তবে আপনি যে লাইব্রেরিটি ব্যবহার করছেন এটি কীভাবে কার্যকর করা হয় তা আপনার উদ্বেগের বিষয় নয়।
বা, হতে পারে, তারা বেসরকারী সেটারগুলিতে ইনজেকশন দেওয়ার মতো ক্ষমতা প্রকাশ করে? সত্যিই আমি এর মুখোমুখি হইনি এবং আমি সত্যিই এটি একটি সাধারণ বৈশিষ্ট্য কিনা তা নিয়ে সন্দেহজনক। তবে এটি সেখানে থাকলেও এটি কোনও সরঞ্জামের একটি সাধারণ কেস যা অপব্যবহার করা যায়। মনে রাখবেন, এমনকি কোনও আইওসি ধারক ছাড়াও এটি কোনও ব্যক্তিগত সম্পত্তি অ্যাক্সেস এবং সংশোধন করার জন্য প্রতিফলন কোডের কয়েকটি লাইন। এটি এমন কিছু যা আপনার প্রায়শই কখনও করা উচিত নয়, তবে এর অর্থ এটি নয় N নেট সক্ষমতা প্রকাশের জন্য খারাপ। যদি কেউ খুব স্পষ্টভাবে এবং বন্যভাবে কোনও সরঞ্জামের অপব্যবহার করে তবে এটি সেই ব্যক্তির দোষ, সরঞ্জামটির নয়।
এখানে চূড়ান্ত পয়েন্ট 2 অনুরূপ। সময় বিস্তীর্ণ, আইওসি পাত্রে নির্মাণকারী ব্যবহার করবেন না! সেটার ইঞ্জেকশনটি খুব নির্দিষ্ট পরিস্থিতিতে দেওয়া হয় যেখানে নির্দিষ্ট কারণে কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করা যায় না। যে কেউ যে সমস্ত সময়ে নির্ভরশীলতার মধ্যে কতটা নির্ভরশীলতা কেটে যাচ্ছে তা কভার করার জন্য সেটার ইঞ্জেকশনটি সর্বদা ব্যবহার করে সেই সরঞ্জামটিকে ব্যাপকভাবে বিমোহিত করে। এটি সরঞ্জামটির দোষ নয়, এটি তাদের।
এখন, যদি নির্দোষভাবে করা খুব সহজ ভুল ছিল এবং আইওসি পাত্রে এটি উত্সাহিত করে, তবে ঠিক আছে, সম্ভবত আপনার কোনও বক্তব্য থাকতে হবে। এটা আমার শ্রেণীর প্রতিটি সদস্যকে পাবলিক করার মতো হবে এবং অন্য লোকদের যখন তাদের জিনিসগুলি পরিবর্তন করা উচিত নয় তখন তাদের দোষ দেওয়া উচিত, তাই না? তবে যে কেউ এসআরপি লঙ্ঘন coverাকতে সেটার ইঞ্জেকশন ব্যবহার করেন তা হয় ইচ্ছাকৃতভাবে মৌলিক নকশার নীতিগুলি অবহেলা বা সম্পূর্ণ অজ্ঞ nt আইওসি পাত্রে এটির জন্য দোষ দেওয়া অযৌক্তিক।
এটি বিশেষত সত্য কারণ এটি দরিদ্র মানুষের ডিআই দিয়ে আপনি খুব সহজেই করতে পারেন এমন কিছু:
var myObject
= new MyTerriblyLargeObject { DependencyA = new Thing(), DependencyB = new Widget(), Dependency C = new Repository(), ... };
সুতরাং সত্যিই, এই উদ্বেগটি কোনও আইওসি পাত্রে ব্যবহৃত হয়েছে কিনা তা সম্পূর্ণরূপে অর্থেগোনাল মনে হয়।
আপনার ক্লাসগুলি কীভাবে একসাথে কাজ করে তা পরিবর্তন করা ওসিপি লঙ্ঘন নয়। যদি এটি হয় তবে সমস্ত নির্ভরতা বিপরীতকরণ ওসিপি লঙ্ঘনকে উত্সাহিত করবে। এটি যদি হয় তবে তারা উভয়ই একই সলিড সংক্ষেপে না!
তদুপরি, পয়েন্ট ক) বা খ) ওসিপি-র সাথে কোনও সম্পর্ক স্থাপনের কাছাকাছি আসে না come আমি ওসিসি সম্মানের সাথে এই উত্তর দিতে জানি না।
কেবলমাত্র আমি অনুমান করতে পারি যে আপনি মনে করেন ওসিপি আচরণের সময় সঞ্চালনের সময় পরিবর্তন না করা বা কোডের মধ্যে নির্ভরতার জীবনচক্রটি কোথা থেকে নিয়ন্ত্রণ করা হয় সে সম্পর্কে করণীয়। এটা না। প্রয়োজনীয়তা যুক্ত করা বা পরিবর্তন করার সময় ওসিপি বিদ্যমান কোডটি সংশোধন না করার বিষয়ে। এটি কোড লেখার বিষয়ে নয়, আপনি ইতিমধ্যে যে কোডটি লিখেছেন তা কীভাবে একসাথে আটকানো হয় তা নয় (যদিও অবশ্যই, আলগা কাপলিং ওসিপি অর্জনের একটি গুরুত্বপূর্ণ অঙ্গ)।
এবং একটি চূড়ান্ত বিষয় যা আপনি বলেছেন:
তবে আমি তৃতীয় পক্ষের সরঞ্জামটিতে একই ভরসা রাখতে পারি না যা আমি নিজে হাতে করতে সক্ষম হবো না এমন জিনিসগুলির জন্য কাজ করার জন্য আমার সংকলিত কোডটি পরিবর্তন করে চলেছে।
হ্যাঁ, আপনি পারেন । আপনার মনে করার কোনও কারণ নেই যে এই সরঞ্জামগুলি- বিপুল সংখ্যক প্রকল্পের উপর নির্ভর করে-অন্য কোনও তৃতীয় পক্ষের লাইব্রেরির চেয়ে অপ্রয়োজনীয় বা অপ্রত্যাশিত আচরণের প্রবণতা।
অভিযোজ্য বস্তু
আমি কেবল লক্ষ্য করেছি যে আপনার পরিচিতি অনুচ্ছেদগুলি কিছু ঠিকানাও ব্যবহার করতে পারে। আপনি কৌতুকপূর্ণভাবে বলছেন যে আইওসি পাত্রে "কোনও গোপন কৌশল ব্যবহার করা হচ্ছে না যা" আমরা কখনও শুনিনি "নির্ভরতা গ্রাফ তৈরির জন্য অগোছালো, সদৃশ-প্রবণ কোড এড়ানোর জন্য"। এবং আপনি একদম ঠিক বলেছেন, তারা যা করছে তা হ'ল এই বিষয়গুলিকে একই বেসিক কৌশলগুলির সাথে সম্বোধন করা যা আমরা প্রোগ্রামাররা সবসময় করি।
অনুমানমূলক দৃশ্যের মাধ্যমে আমাকে আপনার সাথে কথা বলি। আপনি, প্রোগ্রামার হিসাবে, একটি বৃহত অ্যাপ্লিকেশন একসাথে রেখেছেন এবং প্রবেশের জায়গায় আপনি যেখানে নিজের অবজেক্ট গ্রাফটি তৈরি করছেন, আপনি খেয়াল করেন আপনার বেশ অগোছালো কোড রয়েছে। এখানে বেশ কয়েকটি ক্লাস রয়েছে যা বারবার ব্যবহৃত হয় এবং প্রতিবার আপনি তাদের মধ্যে একটি তৈরি করে আবার তাদের অধীনে নির্ভরতার পুরো শৃঙ্খলা তৈরি করতে হয়। এছাড়াও আপনি দেখতে পাচ্ছেন যে প্রত্যেকের জন্য কাস্টম কোড ব্যতীত আপনার নির্ভরতার জীবনকাল নির্ধারণ বা নিয়ন্ত্রণের কোনও অভিব্যক্তি নেই। আপনার কোডটি কাঠামোগত এবং পুনরাবৃত্তি পূর্ণ। আপনার ইন্ট্রো অনুচ্ছেদে আপনি যে গোলযোগের কথা বলছেন এটি এটি।
সুতরাং প্রথমে আপনি কিছুটা রিফ্যাক্টর শুরু করতে পারেন- যেখানে কিছু পুনরাবৃত্তি কোড যথেষ্ট কাঠামোগত হয় আপনি এটিকে সহায়ক পদ্ধতিতে টানতে পারেন ইত্যাদি। তবে আপনি ভাবতে শুরু করেন- এটি কি এমন একটি সমস্যা যা আমি সম্ভবত একটি সাধারণ অর্থে মোকাবিলা করতে পারি, একটি যা এই বিশেষ প্রকল্পের সাথে সুনির্দিষ্ট নয় তবে আপনার ভবিষ্যতের সমস্ত প্রকল্পে আপনাকে সহায়তা করতে পারে?
সুতরাং আপনি বসুন, এবং এটি সম্পর্কে চিন্তা করুন, এবং সিদ্ধান্ত নিন যে এমন কোনও শ্রেণি থাকা উচিত যা নির্ভরতা সমাধান করতে পারে। এটি কী কী সার্বজনীন পদ্ধতির প্রয়োজন তা স্কেচ করুন:
void Bind(Type interfaceType, Type concreteType, bool singleton);
T Resolve<T>();
Bind
"যেখানে আপনি টাইপের কোনও নির্মাণকারী যুক্তি দেখেন, সেখানে interfaceType
একটি উদাহরণ দিয়ে যান concreteType
"। অতিরিক্ত singleton
প্যারামিটারটি বলে যে concreteType
প্রতিটি সময় একই উদাহরণ ব্যবহার করা উচিত , বা সর্বদা একটি নতুন তৈরি করা উচিত।
Resolve
কেবল যে T
কোনও নির্মাণকারীর সাথে এটি নির্মাণ করার চেষ্টা করবে এটি খুঁজে পেতে পারে যার যুক্তিগুলি সমস্ত ধরণের যা পূর্বে আবদ্ধ ছিল। পুরোপুরি নীচে নির্ভরতাগুলি সমাধান করতে এটি নিজেকে পুনরাবৃত্তভাবে কল করতে পারে। যদি এটি কোনও উদাহরণকে সমাধান করতে না পারে কারণ সমস্ত কিছু আবদ্ধ হয় না, তবে এটি একটি ব্যতিক্রম ছুঁড়ে দেয়।
আপনি নিজেই এটিকে বাস্তবায়নের চেষ্টা করতে পারেন এবং আপনাকে দেখতে পাবেন যে আপনার প্রতিবিম্ব কিছুটা দরকার এবং বাঁধাগুলি যেখানে singleton
সত্য সেখানে কিছু ক্যাশে করা দরকার তবে অবশ্যই কঠোর বা ভয়াবহ কিছুই নয়। এবং একবার আপনি- voila হয়ে গেলে, আপনার নিজের আইওসি ধারকটির মূলটি থাকবে! এটা কি আসলেই ভীতিজনক? এটি এবং নিনজেকশন বা স্ট্রাকচারম্যাপ বা ক্যাসেল উইন্ডসর বা আপনি যা পছন্দ করেন তার মধ্যে একমাত্র আসল পার্থক্য হ'ল এই মৌলিক সংস্করণটি পর্যাপ্ত হবে না এমন ক্ষেত্রে (অনেক!) ব্যবহারের ক্ষেত্রে কভার করার জন্য আরও অনেক বেশি কার্যকারিতা রয়েছে। তবে এর হৃদয়ে, আপনার কাছে যা আছে তা একটি আইওসি পাত্রে সারাংশ রয়েছে।
IOC
এবংExplicitness of code
হ'ল। ম্যানুয়াল ডিআই সহজেই নক্ষত্র হয়ে উঠতে পারে, তবে এটি কমপক্ষে স্ব-সংযুক্ত স্পষ্ট প্রোগ্রামের প্রবাহকে এক জায়গায় ফেলে দেয় - "আপনি যা দেখতে পান তা পেয়ে যান, আপনি কী পান"। যদিও আইওসি পাত্রে বাঁধাই এবং ঘোষণাগুলি সহজেই নিজের উপর একটি গোপন সমান্তরাল প্রোগ্রামে পরিণত হতে পারে।