নির্ভরতা ইনজেকশন কীভাবে ভাষায় সংহত হতে পারে? [বন্ধ]


10

নির্ভরতা ইনজেকশনটি কীভাবে সরাসরি সি # এর মতো ভাষার মধ্যে সংহত করা যায় সে সম্পর্কে আমি কিছুটা ভাবছিলাম। আমি একটি সম্ভাব্য সমাধান নিয়ে এসেছি যা সম্পর্কে আমি আপনার মতামত শুনতে চাই। আমি অনেক নির্ভরতা ইনজেকশন ফ্রেমওয়ার্ক ব্যবহার করি নি তাই এমন কিছু হতে পারে যা আমি উপেক্ষা করছি

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

একইভাবে আপনি সেই সেবার বিভিন্ন ধরণের হ্যান্ডলারের নিবন্ধন করেন যাতে আপনি ইনজেকশনের সম্পত্তি প্রকারটি ইনস্ট্যান্ট করতে পারেন।

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

তারপরে আবার এটি কেবল এমন ক্লাসগুলির জন্য একটি সমস্যা যা উচ্চ পারফরম্যান্স সমাধানে ঘন ঘন ইনস্ট্যান্ট হয়ে যায় তাই এটি কোনও সমস্যার বেশি হওয়া উচিত নয়। সম্ভবত আপনি উদাহরণস্বরূপ কোনও ধরণের কারখানা ব্যবহার করতে পারেন।

চিন্তাভাবনা, সমস্যা, প্রশ্ন, আরও ভাল ধারণা?

কোড

public class SomeClass
{

  public SomeClass()
  {
     //implicit behavior if Animal is not set in constructor or initializer
    this.Animal =  GlobalInjector.Get(this,typeof(Mammal))

  }

  public injectable Mammal Animal  
  {
   get;
   set;
  }
}


 GlobalInjector.Register(typeof(Mammal), () => return new Mammal(someParameter));

আপনি কি আমাদের ডিআইয়ের সাথে পরিচিত নন এমন একটি সিউডো কোড উদাহরণ দিতে পারেন? পুনশ্চ. আপনি ডিআই সম্পর্কিত আমার প্রশ্নের উত্তরও দিতে পারেন? :)
স্টিভেন

2
আমি নিশ্চিত যে আমি এটি পেয়েছি। আপনি সমস্ত কি কোনও গ্লোবাল ডিআই কন্টেইনার এবং একটি কীওয়ার্ডের পরিবর্তে '[ইনজেকটেবল]' অ্যাট্রিবিউট দিয়ে পেতে পারেন, তাই না?
নিকি

হাই, আমি আপনার প্রশ্নে ডিআই সম্পর্কে কিছুটা লেখার চেষ্টা করেছি, নিশ্চিত নয় যে এটি এর উত্তর দিয়েছে যদিও
হোমডে

নিকি: হ্যাঁ নিশ্চিত, আমি অনুমান করি আপনি বিভিন্ন উপায়ে প্রকৃত প্রক্রিয়াটি প্রয়োগ করতে পারবেন, অন্তর্নিহিত যুক্তিটি যদি সঠিক হয় তবে আমি আরও আগ্রহী
হোমডে

তাহলে এটি এবং আপনার অতিরিক্ত কীওয়ার্ড ব্যতীত বিদ্যমান আইওসি-র মধ্যে আলাদা কী?
ম্যাথু হোয়াইট

উত্তর:


7

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

নির্ভরতা ইনজেকশন যেমন হয়। এটি ভাষার বাহ্যিক এবং উপযুক্ত ফ্রেমওয়ার্ক সহ প্রয়োগ করা যেতে পারে।

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


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

5

এটি প্রয়োজন হয় না

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

এর অর্থ কোনও বৈশিষ্ট্য নেই, কোনও যাদু স্ট্রিং নেই, কোনও সম্মেলন নেই। কোডের প্রতিটি টুকরাই কেবল জানে যে এটি তার নির্মাতার (/ বৈশিষ্ট্য / পদ্ধতি) কোড গ্রহণ করে এবং এগুলিই।

ডিপেন্ডেন্সি ইনজেকশন সমর্থন করার জন্য আপনার মতো ডিজাইনের সাথে আপনার ভাষাটি মোটেও পরিবর্তন করার দরকার নেই।

এটি সম্ভাব্য বিপদজনক

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

এটি কোনও কোণে নিজেকে আঁকতে পারে এমন কিছু উপায়ে:

  • কেবলমাত্র এক্সএমএল-ভিত্তিক কনফিগারেশন বা কেবল কোড-ভিত্তিক কনফিগারেশন সমর্থন করে
  • কারখানার নকশা প্যাটার্নটি পরিষ্কারভাবে সমর্থন করতে সক্ষম হচ্ছে না (কেবল ক্ষণস্থায়ী উপাদানগুলি নয়: রান-টাইম উত্পন্ন উপাদানগুলি)
  • কোনওভাবে আমার কোড পরিবর্তন করা হচ্ছে যাতে আমাকে নির্ভরতা ইনজেকশন ব্যবহার করতে বাধ্য করা হয়েছিল, এবং ইউনিট পরীক্ষার জন্য কেবল আমার ক্লাসটি ইনস্ট্যান্ট করতে পারিনি
  • কাস্টম জীবনচক্র সমর্থন না
  • এক্সটেনসিবল হচ্ছে না
  • আমার আরও বেশি কাস্টমাইজেশন প্রয়োজন এমন ক্ষেত্রে প্রতিস্থাপনযোগ্য হচ্ছে না
  • এমনভাবে ভেঙে যাচ্ছি যা আমরা এখনও বুঝতে পারি না, কারণ আমাদের .নিট ব্যবহারকারীরা সমস্যাগুলি জানার জন্য যথেষ্ট দীর্ঘসময় ডিআই ব্যবহার করে নি

4

.NET 4 এর সাথে পরিচালিত পরিচালিত এক্সটেনসিবিলিটি ফ্রেমওয়ার্কটি কি আপনি দেখেছেন ? এখানে আমি নিবন্ধটি কয়েকটি উদাহরণ সহ লিখেছি। মূলত এটি রান-টাইম আবিষ্কারের অতিরিক্ত বৈশিষ্ট্য সহ .NET এ অন্তর্নিহিত ইনজেকশনটির একটি রূপ।

সম্পত্তি ইনজেকশনগুলি দেখতে দেখতে:

class Program
{
    [Import]
    public IMessageSender MessageSender { get; set; }
}

কনস্ট্রাক্টর ইঞ্জেকশনগুলি দেখতে দেখতে:

class Program
{
    [ImportingConstructor]
    public Program(IMessageSender messageSender) 
    {
    ...
    }
}

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


এমইএফ প্লাগইন স্টাফের জন্য সত্যিই দুর্দান্ত তবে আমি মনে করি না আমি এটি সাধারণ ডিআই মেকানিজম হিসাবে ব্যবহার করতে চাই
হোমডে

1
@ এমকেও - এটি কী অনুপস্থিত রয়েছে তা আপনি বিশদ বর্ণনা করতে পারেন? আমি সমস্ত নিবন্ধ সম্পর্কে অবহিত, যেখানে গ্লেন ব্লক লোকেদের আশ্বস্ত করার জন্য রেস করে যে এমআইএফ সমস্ত ডিআই ফ্রেমওয়ার্কগুলি প্রতিস্থাপন করতে পারে না , তবে আপনি যদি বিবরণটি দেখেন, তবে এটি স্পষ্টতই অন্য যে কোনও কিছুর চেয়ে রাজনৈতিক বক্তব্য more তবে, যদি আপনি অন্যান্য ডিআই ফ্রেমওয়ার্কের তুলনায় এমইএফ-এর অভাবের বৈশিষ্ট্যগুলির একটি ভাল তালিকা দিতে পারেন, যা লোককে একটি সুবিদিত সিদ্ধান্ত নিতে সহায়তা করবে। এছাড়াও, প্রশ্নটি সি # তে ডিআই ফ্রেমওয়ার্ক সম্পর্কে, এবং এমইএফ স্পষ্টভাবে .NET ফ্রেমওয়ার্কে একটি ডিআই কন্টেইনার।
স্কট হুইটলক

2
  1. আপনি সত্যই কনফিগারেশন প্রক্রিয়াটি বর্ণনা করেন না, যা আইএমএইচও সবচেয়ে জটিল। আপনি কীভাবে একটি থ্রেডে চলমান সমস্ত কোডটি ডিবি-সংযোগ এ ব্যবহার করেন, অন্য থ্রেড সংযোগ বিতে সমস্ত কোড আনড করবেন? আপনি কোনও নির্দিষ্ট সংস্থার ইঞ্জেকশনটি কীভাবে ব্লক করবেন, কারণ বর্তমানে লগ ইন করা ব্যবহারকারীকে এটি অ্যাক্সেস করার অনুমতি নেই?
  2. গ্লোবাল ইনজেক্টর ব্যবহার করবেন না। কোনও বৈশ্বিক জিনিস এটিকে ব্যবহার করবেন না, অথবা আপনি বৈশ্বিক ভেরিয়েবলগুলিও ব্যবহার করতে পারেন। না, গ্লোবালের পরিবর্তে সিঙ্গেলটন বা "স্ট্যাটিক" এর মতো ওওপি-স্পিক ব্যবহার করা তাদের বৈশ্বিক প্রকৃতি পরিবর্তন করে না।
  3. একটি গতিশীল স্কোপযুক্ত ধারক বিবেচনা করুন। যদিও লেজিকাল স্কোপিং ডায়নামিক স্কোপিংয়ের বিরুদ্ধে যথাযথভাবে জিতেছে, আমি বিশ্বাস করি যে গতিশীল স্কোপ বিশ্বব্যাপী সুযোগের জন্য একটি দুর্দান্ত প্রতিস্থাপন করবে। ডিফারেনশিয়াল উত্তরাধিকার একটি দুর্দান্ত বাস্তবায়ন হবে (যেমন প্রোটোটাইপ-ভিত্তিক উত্তরাধিকার হিসাবে)।
  4. আমি বিশ্বাস করি যে কোনও ভাষা-আদেশিত ডিআই-মেকানিজম সত্যই সহজ হওয়া উচিত, সেই উদ্যোগের কোনও কিছুই সি # এবং জাভার আদর্শ নয়। উপরে একটি সাধারণ কনফিগারেশন স্তর সহ একটি গতিশীল স্কোপিং প্রক্রিয়াটি কৌশলটি করতে পারে। এন্টারপ্রাইজীয় সমাধানগুলি তৃতীয় পক্ষের দ্বারা শীর্ষে স্তরিত হতে পারে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.