এটি ডক ব্রাউন এর পরিপূরক জবাব হতে পারে এবং ডাইনাইজের যে উত্তর এখনও প্রশ্নের সাথে জড়িত তাদের উত্তর না দেওয়া মন্তব্যের জবাব দেওয়া।
আপনার সম্ভবত যা দরকার তা হ'ল ডিআই করার একটি কাঠামো। জটিল শ্রেণিবিন্যাসের অর্থ অগত্যা খারাপ নকশা নয়, তবে আপনাকে যদি সরাসরি ডি তে ইনজেকশন না দিয়ে টাইমফ্যাক্টরি বট আপ-আপ (এ থেকে ডি) ইনজেক্ট করতে হয় তবে আপনি যেভাবে ডিপেন্ডেন্সি ইনজেকশন করছেন তাতে সম্ভবত কিছু ভুল আছে।
একটি সিঙ্গলটন? না ধন্যবাদ. আপনার যদি কেবলমাত্র একটি আইট্যান্স প্রয়োজন হয় তবে তা আপনার অ্যাপ্লিকেশন প্রসঙ্গে জুড়ে দিন (ইনফ্যাক্টের মতো ডিআই এর জন্য আইওসি ধারক ব্যবহারের জন্য ++ টাইমফ্যাক্টিকে একক আইসট্যান্স হিসাবে আবদ্ধ করা প্রয়োজন), উদাহরণটি এখানে (সি ++ 11, তবে সি +++++++++++++] ইতিমধ্যে সি ++ এ? আপনি বিনামূল্যে লিক-ফ্রি অ্যাপ্লিকেশন পান):
Infector::Container ioc; //your app's context
ioc.bindSingleAsNothing<TimeFactory>(); //declare TimeFactory to be shared
ioc.wire<TimeFactory>(); //wire its constructor
// if you want to be sure TimeFactory is created at startup just request it
// (else it will be created lazily only when needed)
auto myTimeFactory = ioc.buildSingle<TimeFactory>();
এখন আইওসি পাত্রে ভাল কথাটি হ'ল আপনার ডি ডি পর্যন্ত সময় কারখানা পাস করার দরকার নেই যদি আপনার ক্লাস "ডি" এর জন্য সময় কারখানার প্রয়োজন হয়, কেবল ক্লাস ডি এর জন্য কনস্ট্রাক্টর প্যারামিটার হিসাবে টাইম ফ্যাক্টরি রাখুন class
ioc.bindAsNothing<A>(); //declare class A
ioc.bindAsNothing<B>(); //declare class B
ioc.bindAsNothing<D>(); //declare class D
//constructors setup
ioc.wire<D, TimeFactory>(); //time factory injected to class D
ioc.wire<B, D>(); //class D injected to class B
ioc.wire<A, B>(); //class B injected to class A
আপনি একবারে টাইমফ্যাক্টরি ইনজেকশন করতে দেখেন। "এ" কীভাবে ব্যবহার করবেন? খুব সহজ, প্রতিটি শ্রেণি ইনজেকশন দেওয়া হয়, প্রধান নির্মিত হয় বা কারখানার সাথে স্বতন্ত্র হয়।
auto myA1 = ioc.build<A>(); //A is not "single" so many different istances
auto myA2 = ioc.build<A>(); //can live at same time
প্রতিবার আপনি যখন ক্লাস এ তৈরি করবেন তখন এটি স্বয়ংক্রিয়ভাবে (অলস ইস্তান্টেশন) ডি এবং ডি অবধি সমস্ত নির্ভরতার সাথে ইনজেকশনের সাথে টাইমফ্যাক্টির সাথে ইনজেকশনের ব্যবস্থা করা হবে, সুতরাং কেবলমাত্র 1 টি পদ্ধতিতে কল করে আপনার সম্পূর্ণ শ্রেণিবিন্যাস প্রস্তুত রয়েছে (এমনকি জটিল শ্রেণিবিন্যাসও এইভাবে সমাধান করা হবে) প্রচুর বয়লার প্লেট কোড অপসারণ): আপনাকে "নতুন / মুছুন" কল করতে হবে না এবং এটি খুব গুরুত্বপূর্ণ কারণ আপনি আঠালো কোড থেকে অ্যাপ্লিকেশন লজিককে পৃথক করতে পারেন।
ডি কেবলমাত্র ডি থাকতে পারে এমন তথ্য দিয়ে সময় অবজেক্ট তৈরি করতে পারে
এটি সহজ, আপনার টাইমফ্যাক্টির একটি "তৈরি" পদ্ধতি রয়েছে, তারপরে কেবল একটি আলাদা স্বাক্ষর "তৈরি করুন (প্যারাম)" ব্যবহার করুন এবং আপনার কাজ শেষ। প্যারামিটারগুলি যে কোনও নির্ভরতা নয় প্রায়শই এইভাবে সমাধান করা হয়। এটি "স্ট্রিং" বা "পূর্ণসংখ্যার" মতো জিনিসগুলি ইনজেকশনের দায়িত্বও সরিয়ে দেয় কারণ এটি কেবল অতিরিক্ত বয়লার প্লেট যুক্ত করে।
কে সৃষ্টি করে? আইওসি পাত্রে আইটেম এবং কারখানাগুলি তৈরি করে, কারখানাগুলি বাকী অংশগুলি তৈরি করে (কারখানাগুলি স্বেচ্ছাচারিত প্যারামিটারগুলি সহ বিভিন্ন বস্তু তৈরি করতে পারে, যাতে কারখানার জন্য আপনার সত্যিকারের রাজ্যের প্রয়োজন হয় না)। আইওসি কনটেইনারটির জন্য আপনি এখনও কারখানাগুলিকে মোড়ক হিসাবে ব্যবহার করতে পারেন: সাধারণত ইনজেকশনে আইওসি কনটেইনারটি কথা বলা খুব খারাপ এবং কোনও সার্ভিস লোকেটার ব্যবহার করার মতোই। কিছু লোক আইওসি কনটেইনারকে একটি কারখানার সাথে মুড়িয়ে সমস্যার সমাধান করে (এটি কঠোরভাবে প্রয়োজন হয় না, তবে সুবিধাটিও রয়েছে যে কন্টেইনার দ্বারা স্তরক্রমটি সমাধান করা হয় এবং আপনার সমস্ত কারখানাগুলি বজায় রাখা আরও সহজ হয়ে যায়)।
//factory method
std::unique_ptr<myType> create(params){
auto istance = ioc->build<myType>(); //this code's agnostic to "myType" hierarchy
istance->setParams(params); //the customization you needed
return std::move(istance);
}
নির্ভরতা ইনজেকশনটিকেও অপব্যবহার করবেন না, সাধারণ প্রকারগুলি কেবল শ্রেণীর সদস্য বা স্থানীয় স্কোপযুক্ত ভেরিয়েবল হতে পারে। এটি সুস্পষ্ট বলে মনে হচ্ছে তবে আমি "স্টাড :: ভেক্টর" ইঞ্জেকশন করতে দেখেছি কারণ সেখানে একটি ডিআই ফ্রেমওয়ার্ক ছিল যা এটি অনুমতি দিয়েছে। ডেমিটারের আইনটি সর্বদা মনে রাখবেন: "কেবল আপনাকে যা ইনজেক্ট করতে হবে তা কেবল ইনজেক্ট করুন"