.NET- এ ডিআই প্রয়োগ করার "সঠিক" উপায় কী?


22

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

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

এটি কি আমার আবেদনে নির্ভরতা ইনজেকশন প্রয়োগের সঠিক পন্থা হবে বা অন্য কোনও নীতি অনুসারে আমার এটি প্রয়োগ করা উচিত?


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

আপনি কোন ধরণের নেট নেটওয়ার্ক তৈরি করছেন তা জেনে উত্তর দেওয়া মুশকিল। ডাব্লুপিএফের জন্য একটি ভাল উত্তর এমভিসির পক্ষে খারাপ উত্তর হতে পারে, উদাহরণস্বরূপ।
জেএমকে

সমাধানের জন্য বা প্রতিটি প্রকল্পের জন্য সমস্ত ডিআইডি মডিউলে সমস্ত নির্ভরতা নিবন্ধগুলি সংগঠিত করা আপনার পক্ষে ভাল, এবং আপনি যা পরীক্ষা করতে চান তার উপর নির্ভর করে কিছু পরীক্ষার জন্য একটি। ওহ হ্যাঁ, অবশ্যই আপনার কনস্ট্রাক্টর ইনজেকশন ব্যবহার করা উচিত, অন্য জিনিসগুলি আরও উন্নত / পাগল ব্যবহারের জন্য।
মার্ক রজার্স

উত্তর:


30

আপনি যে সরঞ্জামটি ব্যবহার করতে চলেছেন সে সম্পর্কে এখনও ভাববেন না। আপনি আইওসি কনটেইনার ছাড়াই ডিআই করতে পারেন।

প্রথম বিষয়: মার্ক সিম্যানের ডি নেট ইন ডিআই সম্পর্কে একটি খুব ভাল বই রয়েছে

দ্বিতীয়: রচনা মূল। নিশ্চিত হয়ে নিন যে পুরো সেট আপটি প্রকল্পের এন্ট্রি পয়েন্টে সম্পন্ন হয়েছে। আপনার কোডের বাকী অংশগুলি ইঞ্জেকশন সম্পর্কে জানতে হবে, ব্যবহৃত হচ্ছে এমন কোনও সরঞ্জাম সম্পর্কে নয়।

তৃতীয়: কন্সট্রাক্টর ইনজেকশন হ'ল বেশিরভাগ সম্ভাব্য উপায় (এমন কেস রয়েছে যা আপনি এটি চান না, তবে অনেকগুলি নয়)।

চতুর্থ: ইনজেকশনের একমাত্র উদ্দেশ্যে অযথা ইন্টারফেস / ক্লাস তৈরি এড়াতে ল্যাম্বদা কারখানাগুলি এবং অন্যান্য অনুরূপ বৈশিষ্ট্যগুলি ব্যবহার করে দেখুন।


5
সমস্ত চমৎকার পরামর্শ; বিশেষত প্রথম অংশ: খাঁটি ডিআই কীভাবে করবেন তা শিখুন এবং তারপরে আইওসি পাত্রে সন্ধান শুরু করুন যা সেই পদ্ধতির দ্বারা প্রয়োজনীয় বয়লারপ্লিট কোডের পরিমাণ হ্রাস করতে পারে।
ডেভিড আরনো

6
... বা স্থির যাচাইয়ের সমস্ত সুবিধা রাখতে - আইওসি পাত্রে সমস্ত একসাথে এড়িয়ে যান।
ডেন

আমি এই পরামর্শটি ডিআই-তে প্রবেশের আগে, একটি ভাল সূচনা পয়েন্ট পছন্দ করি এবং আমার কাছে মার্ক সিমেন বইটি রয়েছে।
স্নুপ

আমি এই উত্তর দ্বিতীয় করতে পারেন। অ্যাপ্লিকেশনটি সংযুক্ত মডিউলগুলিতে বুটস্ট্র্যাপার যুক্তির কিছু অংশ ছিঁড়ে আমরা সফলভাবে একটি দারুণ মানস-ডিআই (হস্ত-লিখিত বুটস্ট্র্যাপার) ব্যবহার করেছি।
উইগি

1
সাবধান হও. ল্যাম্বদা ইনজেকশনগুলি ব্যবহার করা পাগলের পক্ষে দ্রুত ট্র্যাক হতে পারে, বিশেষত টেস্ট-প্ররোচিত ডিজাইনের ক্ষয়ক্ষতির মতো। আমি জানি. আমি সেই পথে নেমেছি
jpmc26

13

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

প্রথম অংশটি @ মিয়ামোটো আকিরা (বিশেষত মার্ক সিমেনের "। নেট" বইয়ের উপর নির্ভরশীলতার ইনজেকশনটি পড়ার জন্য সুপারিশটি দিয়ে ভাল উত্তর দিয়েছেন Mar মার্কস ব্লগও একটি ভাল নিখরচায় সংস্থান।

দ্বিতীয় অংশটি একটি ভাল চুক্তি আরও জটিল।

একটি ভাল প্রথম পদক্ষেপটি হ'ল ক্লাস কনস্ট্রাক্টরগুলিতে সমস্ত ইনস্ট্যান্টেশনকে সরানো - নির্ভরতাগুলি ইনজেকশন না করে কেবল এটি নিশ্চিত করা যে আপনি কেবল newকনস্ট্রাক্টরে ফোন করেছেন।

এটি আপনার করা সমস্ত এসআরপি লঙ্ঘনকে হাইলাইট করবে, যাতে আপনি ক্লাসটিকে ছোট সহযোগীদের বিভক্ত করতে শুরু করতে পারেন।

পরবর্তী সমস্যাটি আপনি দেখতে পাবেন এমন ক্লাস হবে যা নির্মাণের জন্য রানটাইম পরামিতিগুলির উপর নির্ভর করে। আপনি সাধারণত সহজ কারখানাগুলি তৈরি করে, প্রায়শই Func<param,type>, নির্মাণকারীকে আরম্ভ করে এবং পদ্ধতিগুলিতে তাদের কল করে এটি ঠিক করতে পারেন।

পরবর্তী পদক্ষেপটি হ'ল আপনার নির্ভরতার জন্য ইন্টারফেস তৈরি করা এবং আপনার ক্লাসে দ্বিতীয় কনস্ট্রাক্টর যুক্ত করা যা এই ইন্টারফেসগুলি ব্যতীত। আপনার প্যারামিটারলেস কনস্ট্রাক্টরটি কংক্রিটের উদাহরণগুলি নতুন করে নতুন কন্সট্রাক্টরের কাছে পাঠিয়ে দেবে। একে সাধারণত 'বি * স্টার্ড ইনজেকশন' বা 'বেচার ম্যান ডিআই' বলা হয়।

এটি আপনাকে কিছু ইউনিট টেস্টিং করার ক্ষমতা দেবে এবং যদি এটি ছিল রিফ্যাক্টরের মূল লক্ষ্য, আপনি যেখানে থামেন সেখানেই হতে পারে। কনস্ট্রাক্টর ইনজেকশন সহ নতুন কোড লেখা হবে তবে আপনার পুরানো কোডটি লিখিত হিসাবে কাজ করা চালিয়ে যেতে পারে তবে এটি পরীক্ষামূলক be

আপনি অবশ্যই আরও যেতে পারেন। যদি আপনি কোনও আইওসি পাত্রে ব্যবহার করার উদ্দেশ্যে থাকেন, তবে পরবর্তী পদক্ষেপটি হতে পারে newআপনার পরামিতিহীন কনস্ট্রাক্টরের সমস্ত সরাসরি কলগুলি আইওসি পাত্রে স্থির কল সহ প্রতিস্থাপন করা , এটি অবশ্যই সার্ভিস লোকেটার হিসাবে ব্যবহার করে (আব)।

এটি আগের মতো কাজ করার জন্য রানটাইম কনস্ট্রাক্টর পরামিতিগুলির আরও কেস ফেলে দেবে।

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

শেষ পর্যন্ত এটি অনেক কাজ হতে চলেছে, সুতরাং আপনি কেন এটি করতে চান তা স্থির করে নিন এবং কোডবেসের যে অংশগুলি রিফ্যাক্টর থেকে সর্বাধিক উপকৃত হবে সেটিকে অগ্রাধিকার দিন sure


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

1
আমি খুশী হয়ে সাহায্য করতে পারি, এবং হ্যাঁ আমি সম্মত হই যে ডিআইয়ের সবচেয়ে বড় সুবিধা হ'ল আলগা সংযোগ এবং সহজেই পুনরায় কনফিগার করার ক্ষমতা যা এনে দেয়, ইউনিট পরীক্ষার একটি দুর্দান্ত পার্শ্ব প্রতিক্রিয়া রয়েছে।
স্টিভ

1

প্রথমে আমি উল্লেখ করতে চাই যে আপনি একটি নতুন প্রকল্প শুরু করার পরিবর্তে একটি বিদ্যমান প্রকল্পের রিফ্যাক্টর করে এটি নিজের উপর উল্লেখযোগ্যভাবে আরও শক্ত করে তুলছেন।

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

ডিআই রিফ্যাক্টরের জন্য আপনার লক্ষ্যটি জানানোর সবচেয়ে সহজ উপায় হ'ল আপনি এই উপাদানটি থেকে 'নতুন' অপারেটরের সমস্ত দৃষ্টান্ত সরাতে চান। এগুলি সাধারণত দুটি বিভাগে পড়ে:

  1. ইনভেরিয়েন্ট সদস্য ভেরিয়েবল: এগুলি এমন ভেরিয়েবল যা একবার সেট করা হয় (সাধারণত কনস্ট্রাক্টারে থাকে) এবং অবজেক্টের আজীবন পুনরায় নিযুক্ত হয় না। এগুলির জন্য আপনি অবজেক্টের একটি উদাহরণটি কনস্ট্রাক্টরে ইনজেক্ট করতে পারেন। আপনি এই জিনিসগুলি নিষ্পত্তি করার জন্য সাধারণত দায়বদ্ধ নন (আমি এখানে কখনই বলতে চাই না, তবে আপনার সত্যিকারের সেই দায় হওয়া উচিত নয়)।

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

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

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

'সহজভাবে' আপনার অ্যাপ্লিকেশনটির প্রতিটি উপাদানগুলির জন্য উপরেরটি পুনরাবৃত্তি করুন, আইওসি ধারকটির রেফারেন্সটিকে উপরে সরানোর সময় আপনি কেবলমাত্র এটির সম্পর্কে কেবল প্রধান প্রয়োজনীয়তা না জানা পর্যন্ত যান।


1
ভাল পরামর্শ: 'বিআইজি পুনরায় লেখার চেয়ে' একটি ছোট উপাদান দিয়ে শুরু করুন
ড্যানিয়েল হোলিনরাকে

0

সঠিক পদ্ধতি হল কনস্ট্রাক্টর ইনজেকশন ব্যবহার করা, যদি আপনি ব্যবহার করেন

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

তারপরে আপনি নির্ভরতা ইনজেকশনের চেয়ে পরিষেবা লোকেটার দিয়ে শেষ করেন।


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

2
না, আপনি যখন ডিআই কনটেইনারটি সূচনা করবেন তখন আপনাকে ইন্টারফেসের প্রয়োগটি নির্দিষ্ট করতে হবে এবং ডিআই কন্টেইনারটি উদাহরণটি তৈরি করবে এবং কনস্ট্রাক্টরকে ইনজেকশন দেবে।
লো ফ্লাইং পেলিকান

ব্যক্তিগতভাবে, আমি কনস্ট্রাক্টর ইঞ্জেকশনটি অতিরিক্ত ব্যবহারের জন্য খুঁজে পাই। আমি এটি প্রায়শই দেখেছি যে 10 টি বিভিন্ন পরিষেবা ইনজেকশন দেওয়া হয় এবং কেবলমাত্র একটি ফাংশন কলের জন্য কেবল একটির প্রয়োজন - তবে ফাংশনের যুক্তির সেই অংশটি কেন হয় না?
নগরহসকি

2
যদি 10 টি বিভিন্ন পরিষেবা ইনজেকশন করা হয় তবে এটি এমন কারণ যে কেউ এসআরপি লঙ্ঘন করছে, যা ছোট উপাদানগুলিতে বিভক্ত হওয়া উচিত।
লো ফ্লাইং পেলিকান

1
@ ফ্যাবিও এই প্রশ্নটি আপনাকে কিনে ফেলবে। আমি এখনও একটি উদাহরণ দেখতে পেলাম যেখানে এমন এক বিশাল শ্রেণীর ক্লাস থাকা যা এক ডজন সম্পূর্ণ ভিন্ন জিনিস নিয়ে কাজ করে একটি ভাল নকশা। ডিআইয়ের একমাত্র জিনিসটি এই সমস্ত লঙ্ঘনকে আরও সুস্পষ্ট করে তুলেছে make
ভু

0

আপনি বলছেন আপনি এটি ব্যবহার করতে চান তবে কেন তা বলবেন না।

ইন্টারফেস থেকে কনক্রিশন তৈরির জন্য মেকানিজম সরবরাহ করা ছাড়া ডিআই কিছুই নয়।

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

ধরে নিই যে আপনি এটি ব্যবহার করতে চান, আপনি সাধারণত অ্যাপ্লিকেশনের প্রথমদিকে কারখানা / বিল্ডার / ধারক (বা যাই হোক না কেন) সেট আপ করেন যাতে এটি স্পষ্টভাবে দৃশ্যমান হয়।

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


0

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

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

একটি বিদ্যমান অ্যাপ্লিকেশনকে সমস্ত ডিআই-তে রূপান্তর করা একটি বিশাল পদক্ষেপ, তবে এটি করার ক্ষেত্রে সুস্পষ্ট অসুবিধা বাদ দিয়ে আপনি এমন একটি ডিআই সরঞ্জাম অন্বেষণ করতে চাইবেন যা আপনার বাইন্ডিংয়ের বেশিরভাগ অংশ স্বয়ংক্রিয়ভাবে সম্পাদন করবে you (নিনজেক্টের মতো কোনও কিছুর মূলটি হ'ল "kernel.Bind<someInterface>().To<someConcreteClass>()"সেই ইন্টারফেসগুলি বাস্তবায়নের জন্য আপনি যে কংক্রিট শ্রেণীর ব্যবহার করতে চান তা আপনার ইন্টারফেসের ঘোষণার সাথে মেলে আপনি যে কলগুলি করেছেন It's এটিই "বাইন্ড" কল যা আপনার ডিআই গ্যাজেটটি আপনার কনস্ট্রাক্টর কলগুলিকে বাধা দেয় এবং সরবরাহ সরবরাহ করে প্রয়োজনীয় নির্ভরশীল অবজেক্টের দৃষ্টান্ত।

public class SomeClass
{
  private ISomeClassA _ClassA;
  private ISomeOtherClassB _ClassB;

  public SomeClass(ISomeClassA aInstanceOfA, ISomeOtherClassB aInstanceOfB)
  {
    if (aInstanceOfA == null)
      throw new NullArgumentException();
    if (aInstanceOfB == null)
      throw new NullArgumentException();
    _ClassA = aInstanceOfA;
    _ClassB = aInstanceOfB;
  }

  public void DoSomething()
  {
    _ClassA.PerformSomeAction();
    _ClassB.PerformSomeOtherActionUsingTheInstanceOfClassA(_ClassA);
  }
}

মনে রাখবেন যে এই কোডটিতে কোথাও এমন কোনও কোড নেই যা তৈরি করেছে / পরিচালিত / প্রকাশ করেছে স্যামসনক্রিটক্র্যাসা বা সামোরথ্রন্টক্রিটস্লাবের উদাহরণ। প্রকৃতপক্ষে, কোন কংক্রিট শ্রেণি এমনকি রেফারেন্স করা হয়নি। তো ... যাদু কোথায় ঘটল?

আপনার অ্যাপ্লিকেশনটির প্রারম্ভ অংশে নিম্নলিখিতটি ঘটেছে (আবার, এটি সিউডো কোড তবে এটি বাস্তব (নিনেক্ট) জিনিসটির খুব কাছে ...):

public void StartUp()
{
  kernel.Bind<ISomeClassA>().To<SomeConcreteClassA>();
  kernel.Bind<ISomeOtherClassB>().To<SomeOtherConcreteClassB>();
}

কোডটির এই সামান্য অংশটি নিনজেক্ট গ্যাজেটটিকে নির্মাতাদের সন্ধান করতে, তাদের স্ক্যান করতে, ইন্টারফেসের উদাহরণগুলি সন্ধান করতে বলে যে এটি হ্যান্ডেল করার জন্য কনফিগার করা হয়েছে (এটিই "বাইন্ড" কলগুলি) এবং তারপরে যেখানেই কংক্রিট শ্রেণীর একটি উদাহরণ তৈরি এবং প্রতিস্থাপন করতে পারে tells উদাহরণ উল্লেখ করা হয়।

একটি দুর্দান্ত সরঞ্জাম রয়েছে যা নিনজেক্টকে খুব ভাল বলে নিনজেক্ট নামে পরিচিত করে তোলে x এক্সটেনশনগুলি C কনভেনশনগুলি (আরও একটি নুগেট প্যাকেজ) যা আপনার জন্য এই কাজটি বেশিরভাগ ক্ষেত্রেই করবে। আপনি নিজেরাই এটি তৈরি করার সাথে সাথে দুর্দান্ত শেখার অভিজ্ঞতাটি সরিয়ে নেবেন না, তবে নিজেকে শুরু করার জন্য, এটি অনুসন্ধানের একটি সরঞ্জাম হতে পারে।

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

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


0

এখানে কোনও "সঠিক উপায়" নেই তবে অনুসরণ করার জন্য কয়েকটি সহজ নীতি রয়েছে:

  • অ্যাপ্লিকেশনটির শুরুতে কম্পোজিশনের মূল তৈরি করুন
  • কম্পোজিশনের মূল তৈরি হওয়ার পরে, ডিআই কনটেইনার / কার্নেলের রেফারেন্সটি দূরে ফেলে দিন (বা কমপক্ষে এটি আবদ্ধ করুন যাতে এটি আপনার অ্যাপ্লিকেশন থেকে সরাসরি অ্যাক্সেসযোগ্য নয়)
  • "নতুন" এর মাধ্যমে দৃষ্টান্ত তৈরি করবেন না
  • সমস্ত প্রয়োজনীয় নির্ভরতাগুলি কনস্ট্রাক্টরের বিমূর্ততা হিসাবে পাস করুন

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


সুতরাং, "নতুন" ছাড়াই এবং ডিআই কনটেইনার না জেনে রানটাইমের সময় কীভাবে অবজেক্ট তৈরি করা যায়?

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

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