ক্ষেত্রের ইনজেকশনটি আমার স্বাদের জন্য কিছুটা "দূরত্বে ভুতুড়ে ক্রিয়া" ।
আপনি আপনার গুগল গ্রুপ পোস্টে যে উদাহরণটি দিয়েছেন তা বিবেচনা করুন:
public class VeracodeServiceImplTest {
@Tested(fullyInitialized=true)
VeracodeServiceImpl veracodeService;
@Tested(fullyInitialized=true, availableDuringSetup=true)
VeracodeRepositoryImpl veracodeRepository;
@Injectable private ResultsAPIWrapper resultsApiWrapper;
@Injectable private AdminAPIWrapper adminApiWrapper;
@Injectable private UploadAPIWrapper uploadApiWrapper;
@Injectable private MitigationAPIWrapper mitigationApiWrapper;
static { VeracodeRepositoryImpl.class.getName(); }
...
}
সুতরাং মূলত আপনি যা বলছেন তা হ'ল "আমার কাছে এই শ্রেণিটি প্রাইভেট স্টেটের সাথে রয়েছে @injectable
, যার সাথে আমি টীকাগুলি সংযুক্ত করেছি , যার অর্থ এই যে রাষ্ট্রটি বাইরের থেকে কোনও এজেন্ট দ্বারা স্বয়ংক্রিয়ভাবে জনবহুল হতে পারে, যদিও আমার রাজ্যটি সমস্ত ব্যক্তিগত হিসাবে ঘোষণা করা হয়েছিল । "
আমি এটির জন্য প্রেরণাগুলি বুঝতে পারি। এটি সঠিকভাবে কোনও ক্লাস স্থাপনের অন্তর্নিহিত অনুষ্ঠানের অনেক অংশ এড়ানোর চেষ্টা। মূলত, যা বলছে তা হ'ল "আমি এই সমস্ত বয়লারপ্লেটটি লিখতে ক্লান্ত হয়ে পড়েছি, তাই আমি কেবল আমার সমস্ত রাজ্যই বর্নিত করতে যাচ্ছি, এবং ডিআই কনটেইনর এটি আমার জন্য সেট করার বিষয়ে খেয়াল রাখুক" "
এটি একদম বৈধ দৃষ্টিকোণ। তবে এটি ভাষা বৈশিষ্ট্যগুলির পক্ষেও কার্যকর যেগুলি তর্কিতভাবে চারপাশে কাজ করা উচিত নয়। এছাড়াও, কেন সেখানে থামেন? Ditionতিহ্যগতভাবে, ডিআই প্রতিটি ক্লাসের সহযোগী ইন্টারফেস থাকার উপর নির্ভর করে। টীকাগুলি দিয়ে সেই সমস্ত ইন্টারফেসগুলি কেন মুছে ফেলবে না?
বিকল্পটি বিবেচনা করুন (এটি সি # হতে চলেছে, কারণ আমি এটি আরও ভাল জানি, তবে জাভাতে সম্ভবত একটি সঠিক সমতুল্য রয়েছে):
public class VeracodeService
{
private readonly IResultsAPIWrapper _resultsApiWrapper;
private readonly IAdminAPIWrapper _adminApiWrapper;
private readonly IUploadAPIWrapper _uploadApiWrapper;
private readonly IMitigationAPIWrapper _mitigationApiWrapper;
// Constructor
public VeracodeService(IResultsAPIWrapper resultsApiWrapper, IAdminAPIWrapper adminApiWrapper, IUploadAPIWrapper uploadApiWrapper, IMitigationAPIWrapper mitigationApiWrapper)
{
_resultsAPIWrapper = resultsAPIWrapper;
_adminAPIWrapper = adminAPIWrapper;
_uploadAPIWrapper = uploadAPIWrapper;
_mitigationAPIWrapper = mitigationAPIWrapper;
}
}
ইতিমধ্যে আমি এই ক্লাস সম্পর্কে কিছু জিনিস জানি। এটি একটি অপরিবর্তনীয় শ্রেণি; রাজ্যটি কেবল নির্মাত্রে সেট করা যেতে পারে (রেফারেন্সগুলি, এই বিশেষ ক্ষেত্রে)। এবং সমস্ত কিছু একটি ইন্টারফেস থেকে উদ্ভূত হওয়ার কারণে, আমি নির্মাত্রে বাস্তবায়নগুলি অদলবদল করতে পারি, এটিই যেখানে আপনার বিদ্রূপগুলি আসে।
এখন আমার সমস্ত ডিআই কন্টেইনারটি কি কি অবজেক্টগুলি নতুন করতে হবে তা নির্ধারণের জন্য নির্মাতার উপর প্রতিফলিত হয়। তবে সেই প্রতিবিম্বটি প্রথম-শ্রেণীর উপায়ে জনসাধারণের উপর করা হচ্ছে ; অর্থাত্ মেটাডেটা ইতিমধ্যে শ্রেণীর অংশ, এটি কনস্ট্রাক্টরে ঘোষিত হয়েছে, একটি পদ্ধতি যার স্পষ্ট উদ্দেশ্য শ্রেণীর জন্য প্রয়োজনীয় নির্ভরতা সরবরাহ করা।
অনুমোদিত এটি অনেকগুলি বয়লারপ্লেট, তবে ভাষাটি এভাবেই ডিজাইন করা হয়েছিল। টীকাগুলি এমন কোনও কিছুর জন্য নোংরা হ্যাকের মতো মনে হচ্ছে যা ভাষায় তৈরি করা উচিত ছিল।