নির্ভরতা সংগঠিত করার সময় C#- এ নির্ভরতা ইনজেকশন একটি জীবন রক্ষাকারী - বিশেষ করে আরও জটিল ASP.NET কোর অ্যাপ্লিকেশনগুলিতে। এবং আপনি যদি ইতিমধ্যেই IServiceCollection-এর সাথে পরিচিত হন বা ইতিমধ্যেই প্রদত্ত DI অফারগুলির সাথে যতটা সম্ভব কাছাকাছি থাকতে চান, C#-এ Scrutor একটি দুর্দান্ত উন্নতি।
এই নিবন্ধে, আমি আপনাকে C# এ নির্ভরতা ইনজেকশন এবং স্ক্রুটারের একটি উচ্চ-স্তরের ওভারভিউ প্রদান করব। কিন্তু সেখান থেকে, আমরা সরাসরি 3 টি টিপস নিয়ে যাচ্ছি যা আপনি Scrutor এর সাথে ব্যবহার করতে পারেন যা আপনার অ্যাপ্লিকেশনে খুব সহায়ক হতে পারে!
স্ক্রুটার হল C# এ একটি শক্তিশালী NuGet প্যাকেজ যা নির্ভরতা ইনজেকশন বাড়ায়। এটি নির্ভরতাগুলির নিবন্ধন এবং রেজোলিউশনকে সহজ করে, আপনার কোড পরিচালনা এবং সংগঠিত করা সহজ করে তোলে৷
ডিপেনডেন্সি ইনজেকশন হল অ্যাপ্লিকেশান কনফিগার করার একটি জনপ্রিয় পদ্ধতি যা ঢিলেঢালা কাপলিংকে উৎসাহিত করে এবং পরীক্ষাযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করে। এটি সরাসরি ক্লাসের মধ্যে তৈরি করার পরিবর্তে একটি শ্রেণিতে নির্ভরতাকে ইনজেকশনের সাথে জড়িত। এর মানে হল যে নির্ভরতা তৈরি করার দায়িত্ব যে শ্রেণীর প্রয়োজন তার মালিকানাধীন নয়, বরং কল স্ট্যাকের উপরে থাকা কারও মালিকানাধীন। অবশেষে, এটি প্রায় সমস্ত নির্ভরতা সৃষ্টিকে একটি অ্যাপ্লিকেশনের এন্ট্রি পয়েন্টে ঠেলে দেয়, এটিকে দুর্বিসহ করে তোলে। যাইহোক, নির্ভরতা ইনজেকশন ফ্রেমওয়ার্কগুলি এই সমস্ত যুক্তিকে পরিষ্কার এবং সংগঠিত করতে সহায়তা করে।
স্ক্রুটার নির্ভরতা নিবন্ধন এবং সমাধান করার একটি সহজ এবং স্বজ্ঞাত উপায় প্রদান করে এই ধারণাটিকে আরও এক ধাপ এগিয়ে নেয়। Scrutor এর সাথে, আপনাকে আর ম্যানুয়ালি প্রতিটি নির্ভরতা একে একে নিবন্ধন করতে হবে না। পরিবর্তে, আপনি প্রক্রিয়াটি স্বয়ংক্রিয় করতে নিয়মাবলী এবং বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।
রেজিস্ট্রেশন এবং রেজোলিউশনের জন্য C# তে Scrutor কীভাবে ব্যবহার করবেন তা ব্যাখ্যা করতে, আসুন একটি সাধারণ দৃশ্য বিবেচনা করি। কল্পনা করুন আমাদের কাছে একটি অ্যাপ্লিকেশন রয়েছে যার জন্য বিভিন্ন ডেটা রিপোজিটরি যেমন UserRepository এবং ProductRepostiory ব্যবহার করতে হবে।
প্রথমত, আমাদের প্রজেক্টে স্ক্রুটার নুগেট প্যাকেজ ইনস্টল করতে হবে। প্যাকেজ ম্যানেজার কনসোল খুলুন এবং নিম্নলিখিত কমান্ডটি চালান:
Install-Package Scrutor
এর পরে, আমাদের সংগ্রহস্থল এবং তাদের সংশ্লিষ্ট ইন্টারফেসগুলিকে সংজ্ঞায়িত করতে হবে। এই উদাহরণটি মূলত খালি, কিন্তু আমরা কিছুক্ষণের মধ্যে এইগুলি উল্লেখ করব:
public interface IUserRepository { // Interface methods } public class UserRepository : IUserRepository { // Implementation } public interface IProductRepository { // Interface methods } public class ProductRepository : IProductRepository { // Implementation }
এখন, আসুন স্ক্রুটার ব্যবহার করে আমাদের নির্ভরতাগুলিকে ওয়্যার আপ করি। আপনার স্টার্টআপ কোডে (যেমন ASP.NET কোরে ConfigureServices পদ্ধতিতে), নিম্নলিখিত কোড যোগ করুন:
services.Scan(scan => scan .FromAssemblyOf<Startup>() .AddClasses(classes => classes.AssignableToAny( typeof(IUserRepository), typeof(IProductRepository))) .AsImplementedInterfaces() .WithScopedLifetime());
এই কোডটি স্টার্টআপ ক্লাস ধারণ করে এমন সমাবেশ স্ক্যান করতে স্ক্রুটার থেকে স্ক্যান পদ্ধতি ব্যবহার করে। এটি তারপর IUserRepository বা IProductRepository ইন্টারফেসে বরাদ্দযোগ্য ক্লাসগুলিকে ফিল্টার করে। অবশেষে, এটি এই ইন্টারফেসের বাস্তবায়নকে ম্যাপ করে এবং তাদের নিজ নিজ ইন্টারফেসের সাথে নিবন্ধন করে।
এখন, আমরা আমাদের ক্লাসে এই নির্ভরতাগুলি ইনজেক্ট করতে পারি। উদাহরণস্বরূপ, ধরা যাক আমাদের একটি UserService ক্লাস আছে যার জন্য IUserRepository প্রয়োজন:
public class UserService { private readonly IUserRepository _userRepository; public UserService(IUserRepository userRepository) { _userRepository = userRepository; } // Rest of the class implementation }
IUserRepositoryকে কনস্ট্রাক্টরের উপর নির্ভরতা হিসাবে ঘোষণা করার মাধ্যমে, IServiceCollection-এর সাথে Scrutor স্বয়ংক্রিয়ভাবে সমাধান করবে এবং আমাদের জন্য UserRepository ইন্সট্যান্স ইনজেক্ট করবে।
কল্পনা করুন আপনার কাছে একটি পরিষেবা ইন্টারফেস IService
এবং একটি বাস্তবায়ন MyService
আছে। আপনি লগিং উদ্বেগের সাথে ব্যবসার যুক্তিকে দূষিত না করে MyService
এ প্রতিটি মেথড কলের এন্ট্রি এবং প্রস্থান লগ করতে চান।
প্রথমে, IService
ইন্টারফেস এবং এর বাস্তবায়ন সংজ্ঞায়িত করুন:
public interface IService { void DoWork(); } public class MyService : IService { public void DoWork() { // Business logic here } }
এর পরে, একটি ডেকোরেটর ক্লাস LoggingDecorator
তৈরি করুন যা IService
প্রয়োগ করে। এই ক্লাসটি প্রকৃত পরিষেবাটি মোড়ানো হবে এবং অর্পিত পদ্ধতি কলগুলির চারপাশে লগিং যোগ করবে:
public class LoggingDecorator : IService { private readonly IService _decorated; private readonly ILogger<LoggingDecorator> _logger; public LoggingDecorator(IService decorated, ILogger<LoggingDecorator> logger) { _decorated = decorated; _logger = logger; } public void DoWork() { _logger.LogInformation("Starting work."); _decorated.DoWork(); _logger.LogInformation("Finished work."); } }
এখন, Startup.cs
বা যেখানেই আপনি আপনার পরিষেবাগুলি কনফিগার করেন সেখানে আপনার পরিষেবা এবং এর ডেকোরেটর নিবন্ধন করতে Scrutor ব্যবহার করুন:
public void ConfigureServices(IServiceCollection services) { // Register the base service services.AddScoped<IService, MyService>(); // Use Scrutor to apply the decorator services.Decorate<IService, LoggingDecorator>(); // Make sure to register the ILogger or ILogger<T> dependencies if not already done }
এই সেটআপটি LoggingDecorator
এর সাথে IService
রেজিস্ট্রেশন মোড়ানোর জন্য Scrutor ব্যবহার করে। IService
সমাধান করার সময়, DI কন্টেইনার LoggingDecorator
এর একটি উদাহরণ প্রদান করবে, যা পরবর্তীতে MyService
এর একটি দৃষ্টান্ত র্যাপ করে। এই পদ্ধতিটি আপনার ব্যবসার যুক্তির বাইরে লগিং লজিক রেখে উদ্বেগের বিচ্ছেদ অর্জন করে।
যখন আমরা জটিল সিস্টেম তৈরি করছি, তখন প্রায়শই এমন কিছু ঘটনা ঘটে যেখানে আমরা ফিচার ফ্ল্যাগের মতো কিছু প্রবর্তন করতে চাই। এগুলি আমাদের কনফিগারেশনের উপর ভিত্তি করে বিভিন্ন কোড পাথ নিতে দেয় এবং একটি সম্পূর্ণ অ্যাপ্লিকেশন পুনরায় কম্পাইল এবং স্থাপন করতে হবে না। কিছু পরিস্থিতিতে, এটি শুধুমাত্র একটি ভিন্ন কোড পথ বেছে নেওয়ার বিষয়ে নয়, এটি কোনও কিছুর সম্পূর্ণ বাস্তবায়নকে অদলবদল করার বিষয়ে!
আসুন একসাথে একটি উদাহরণ চেষ্টা করা যাক! ধরে নিন আপনার একাধিক বাস্তবায়ন সহ একটি IFeatureService
ইন্টারফেস রয়েছে: NewFeatureService
(একটি নতুন, পরীক্ষামূলক বৈশিষ্ট্য) এবং StandardFeatureService
(বর্তমান, স্থিতিশীল বৈশিষ্ট্য)। আপনি একটি কনফিগারেশন পতাকার উপর ভিত্তি করে রানটাইমে এই বাস্তবায়নের মধ্যে স্যুইচ করতে চান।
প্রথমে, IFeatureService
ইন্টারফেস এবং এর বাস্তবায়ন সংজ্ঞায়িত করুন:
public interface IFeatureService { void ExecuteFeature(); } public class NewFeatureService : IFeatureService { public void ExecuteFeature() { // New feature logic } } public class StandardFeatureService : IFeatureService { public void ExecuteFeature() { // Standard feature logic } }
এর পরে, একটি বৈশিষ্ট্য টগল সেটিং এর উপর ভিত্তি করে কোন বাস্তবায়ন ব্যবহার করতে হবে তা নির্ধারণ করার জন্য আপনার একটি উপায় প্রয়োজন। এটি appsettings.json
, একটি ডাটাবেস সেটিং বা অন্য কোনো কনফিগারেশন উৎসের একটি মান হতে পারে।
এখন, বৈশিষ্ট্য টগলের উপর ভিত্তি করে উপযুক্ত পরিষেবা বাস্তবায়ন গতিশীলভাবে নিবন্ধন করতে Scrutor ব্যবহার করুন:
public void ConfigureServices(IServiceCollection services) { // Assume GetFeatureToggleValue() retrieves the current feature toggle setting var useNewFeature = GetFeatureToggleValue("UseNewFeature"); // Dynamically register the appropriate implementation based on the feature toggle if (useNewFeature) { services.AddScoped<IFeatureService, NewFeatureService>(); } else { services.AddScoped<IFeatureService, StandardFeatureService>(); } // Optional: You could combine this with the previous example // to use the decorator pattern too! // services.Decorate<IFeatureService, FeatureServiceProxy>(); } private bool GetFeatureToggleValue(string featureName) { // This method would typically check your // configuration source to determine if the feature is enabled // For simplicity, this is just a placeholder return false; // or true based on actual configuration }
এই মত একটি পদ্ধতি গ্রহণ আমাদের সাহায্য করতে পারে:
এই নিবন্ধে, আমি আপনাকে C# এ স্ক্রুটারের সাথে নির্ভরতা ইনজেকশনের জন্য 3 টি সহজ টিপস দিয়েছি। নির্ভরতা ইনজেকশন কী এবং কীভাবে স্ক্রুটার এতে ফিট করে তার একটি সংক্ষিপ্ত বিবরণের পরে, আমরা আমাদের উদাহরণগুলিতে সরাসরি ঝাঁপিয়ে পড়ি। আমরা অ্যাসেম্বলি স্ক্যানিং দেখতে পেয়েছি, কীভাবে নির্ভরতাগুলিকে সাজাতে হয় এবং এমনকি কীভাবে সম্পূর্ণ বাস্তবায়নের বৈশিষ্ট্যগুলিকে ফ্ল্যাগিং বিবেচনা করতে হয়!
নির্ভরতা ইনজেকশন এমন একটি জিনিস যা আপনার অ্যাপ্লিকেশনগুলিকে জটিলতা বাড়ার সাথে সাথে এটিকে ব্যাপকভাবে সরল করতে পারে এবং আপনি যদি Microsoft এর অন্তর্নির্মিত IServiceCollection অফারটিতে আটকে থাকতে চান তবে Scrutor একটি বিশাল সাহায্য হতে পারে। আপনি যদি এটিকে দরকারী বলে মনে করেন এবং আপনি আরও শেখার সুযোগ খুঁজছেন, তাহলে আমার বিনামূল্যের সাপ্তাহিক সফ্টওয়্যার ইঞ্জিনিয়ারিং নিউজলেটারে সদস্যতা নেওয়ার কথা বিবেচনা করুন এবং YouTube এ আমার বিনামূল্যের ভিডিওগুলি দেখুন! ডিসকর্ডে আমার এবং অন্যান্য সম্প্রদায়ের সদস্যদের সাথে যোগ দিন!
এছাড়াও এখানে প্রকাশিত.