সিরিয়ালাইজেশন নির্ভরতা ইনজেকশন এর ব্যবহারকে বাদ দেয়?


9

সাধারণ প্রশ্ন: আমি বুঝতে পেরেছি যে সি # তে সিরিয়ালাইজেশনের জন্য ডিফল্ট নির্মাণকারী প্রয়োজন। এটি কনস্ট্রাক্টর ইনজেকশন ডিআই (যা সাধারণত ডিআই এর পছন্দের স্টাইল, আমার পড়ার [উদ্ধৃতি প্রয়োজনীয়] ) ব্যবহারের সম্ভাবনা দূর করে দেয় । তাহলে কি এটি সত্যিই হয়-বা পরিস্থিতি, বা আমি কিছু মিস করছি?

(পার্শ্ব প্রশ্ন): আইওসি কনটেইনাররা কি কোনওভাবে এই ট্রেড অফকে একপাশে পদক্ষেপ দেয়?


This would eliminate the possibility of using Constructor injected DI- কেন? আপনার এখনও প্যারামিটারাইজড ইন্সট্রাক্টর থাকতে পারে, যতক্ষণ আপনি সিরিয়ালাইজেশনের উদ্দেশ্যে ডিফল্ট কনস্ট্রাক্টর অন্তর্ভুক্ত করেন (যদি আপনি পছন্দ করেন তবে ডিফল্ট কনস্ট্রাক্টর ব্যক্তিগত হতে পারে)।
রবার্ট হার্ভে

টুইটার "প্যারামিটারাইজড ইন্সট্রাক্টর" কী? (typo?) একবার কোনও বস্তু ডি-সিরিয়াল হয়ে গেলে আমি আবার এটি নির্মাণ করতে পারি না। আপনি কি পরামর্শ দিচ্ছেন যে আমি কোনও পূর্বনির্ধারিত বস্তুর উপর সম্পত্তি / সেটার ইনজেকশন ব্যবহার করব?
কিমিওট

1
একটি প্যারামিটারাইজড কনস্ট্রাক্টর প্যারামিটার সহ একটি। আমি এখানে ধরে নিচ্ছি যে ডেসরিয়ালাইজেশন এমন ডেটা থেকে ঘটেছিল যা নির্ভর করে ইনজেকশন ব্যবহার করে সঠিকভাবে নির্মিত হয়েছিল এমন কোনও বস্তু থেকে প্রাপ্ত হয়েছিল। ডিসিরিয়ালাইজেশনের সময় আপনাকে অবজেক্টটি তৈরি করতে হবে না; এটি ইতিমধ্যে নির্মিত হয়েছিল।
রবার্ট হার্ভে

1
না, আপনি ভুল করছেন না এটি কিভাবে এটি কাজ করে। এটিকে পিছনের দরজার ইঞ্জেকশন হিসাবে ভাবেন। আপনি কোনও বৈধতা পাবেন না, তবে এটি কার্যকর হবে। নোট করুন যে বাইনারিফর্মেটর এবং ডেটা কন্ট্রাক্টস্রায়ালাইজারের জন্য ডিফল্ট কনস্ট্রাক্টরের প্রয়োজন হয় না।
রবার্ট হার্ভে

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

উত্তর:


6

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

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


1

আমি এই সমস্যাটি সমাধান করছি: নির্ভরতার কারখানাগুলি ইনজেকশনের জন্য। এই কারখানাগুলিতে, কনটেইনারটিতে নিবন্ধিত হওয়ার সাথে সাথে প্রথমে নির্ভরতা সমাধান করুন, তারপরে অবশিষ্ট সমস্ত ডেটা "ডিসরিয়ালাইজিং" করুন: json.net বিদ্যমান অবজেক্টে ক্ষেত্রগুলি পপুলেট করতে দেয়।

আইওসি পাত্রে ওয়্যারিং কোডের সাথে কারখানাগুলির কোডটি চলে যায় বলে আমি মনে করি না container.Resolveকারখানার অভ্যন্তরে ব্যবহার করা নিয়ম লঙ্ঘন করে, যা containerকোডের এক জায়গায় ব্যবহার করতে হবে: যেখানে সমস্ত তারের ঘটনা ঘটে।

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

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

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