কারখানার প্যাটার্নের সাথে একত্রে নির্ভরতা ইনজেকশন কীভাবে ব্যবহার করবেন


10

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

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

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

উত্তর:


8

এটি করার সঠিক উপায় হ'ল একটি ইন্টারফেসের উপর নির্ভর করে এবং তারপরে ক্লাস বিতে সেই ইন্টারফেসটির একটি বাস্তবায়ন ইনজেকশনের জন্য to

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

সুতরাং ক্লাস বি এর কনস্ট্রাক্টরটিকে প্রয়োজনীয় ক্লাসটির জন্য একটি ইন্টারফেস নিতে হবে এবং কারখানাকে ইন্টারফেসের প্রয়োগকারী হিসাবে সেই শ্রেণিটি তৈরি করতে হবে। কারখানার উপর নির্ভর করবে না, ইন্টারফেসের উপর নির্ভর করবে এবং কারখানাকে সেই কারখানার একটি বাস্তবায়ন সরবরাহ করবে।

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

নীচের লাইন: নির্ভরতা ইনজেকশন করতে দ্বিধা করবেন না। জিনিসগুলি করার স্বাভাবিক উপায় এটি হওয়া উচিত।


কনস্ট্রাক্টর ইনজেকশনটি যতক্ষণ সম্ভব নতুন-ইন জিনিস বন্ধ করে দেয়?
জেফও

এটি অসম্পূর্ণ ছিল - আমি "আপনার অ্যাপ্লিকেশন যথাসম্ভব পিছনে" বলার জন্য এটি স্থির করেছি।
নিক হজস

হ্যাঁ. আমি কারখানার পরিবর্তে পার্সার ইন্টারফেসের উপর নির্ভর করে ভাবছিলাম। এখন অন্য শ্রেণি যদি বি ক্লাস ব্যবহার করে তবে এটি ইন্টারফেসের উপর নির্ভর করতে হবে যা ক্লাস বি নির্ভর করে। এটি শীর্ষ স্তরের শ্রেণি পর্যন্ত সর্বত্র চলতে থাকবে। এই শীর্ষ স্তরের শ্রেণিকে শেষ পর্যন্ত পার্সারের উপযুক্ত কংক্রিটের উদাহরণটি ইনস্ট্যান্ট করতে একটি কারখানা ব্যবহার করতে হবে। শীর্ষ স্তরের শ্রেণীর কোনও কারখানার উপর নির্ভর করা উচিত বা এটি সরাসরি তার পদ্ধতির মধ্যে কারখানাটি ব্যবহার করা উচিত?
CKing

1
ভাল বলেছেন: নির্ভরতা ইনজেকশন করতে দ্বিধা করবেন না
কোডেডি

9

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

এটি বলেছিল, নির্ভরতা ইনজেকশন এবং আপনি সাধারণত কীভাবে এটি ব্যবহার করবেন সে সম্পর্কে আমাকে কিছুটা ব্যাখ্যা করতে দিন।

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

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

অর্থাত

IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();

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

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

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


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

আমি মনে করি আপনি যে বিষয়টি ডিআই ফ্রেমওয়ার্ক বা ডিআই কনটেইনার সম্পর্কে কথা বলেননি সেহেতু আপনি বিষয়টিটি মিস করেছেন।
ডক ব্রাউন

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

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

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

5

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

আমি নিয়মিত কারখানায় ইনজেক্ট করতে ডিআই ব্যবহার করি।


1
কোনও শ্রেণি যদি কারখানার উপর নির্ভর করে তবে ইউনিটটি যখন সেই শ্রেণির পরীক্ষার করবে তখন আপনাকে কারখানাকে উপহাস করতে হবে। কীভাবে আপনি এটি করতে যান? ক্লাসটি কোনও কারখানার ইন্টারফেসের উপর নির্ভর করবে?
CKing

4

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


class Parent
{
    private IParserFactory parserFactory;
    public Parent(IParserFactory factory)
    {
        parserFactory = factory
    }

    public ParsedObject ParseFrom(string filename, FileType fileType)
    {
        var parser = parserFactory.CreateFor(fileType);
        return parser.Parse(filename);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.