Swinject হল Swift-এর জন্য একটি DI কন্টেইনার যা iOS অ্যাপ্লিকেশনে Dependency Injection প্যাটার্ন বাস্তবায়ন করে। ফ্রেমওয়ার্ক নির্ভরতা তৈরি এবং ইনজেকশন স্বয়ংক্রিয় করে, ম্যানুয়াল অবজেক্ট এবং ফ্যাক্টরি ব্যবস্থাপনা দূর করে। GitHub-এ Swinject অনুসারে, লাইব্রেরিটি Constructor Injection, Property Injection এবং Method Injection সমর্থন করে একটি নমনীয় scopes সিস্টেমের সাথে জীবনকাল পরিচালনার জন্য।
মূল পয়েন্ট
Swinject হল Swift ভাষার জন্য একটি ওপেন-সোর্স DI কন্টেইনার, যা iOS, macOS এবং watchOS-এর জন্য অ্যাপ্লিকেশনে নির্ভরতা ইনজেকশন সরল করার জন্য ডিজাইন করা হয়েছে। ফ্রেমওয়ার্ক Service Locator পদ্ধতি ব্যবহার করে: পরিষেবাগুলি একটি কেন্দ্রীয় কন্টেইনারে নিবন্ধিত হয়, এবং কন্টেইনার স্বয়ংক্রিয়ভাবে নির্ভরতা গ্রাফ সমাধান করে যখন একটি ইনস্ট্যান্স অনুরোধ করা হয়।
Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যেখানে একটি অবজেক্ট তার নির্ভরতা বাইরে থেকে গ্রহণ করে ভিতরে তৈরি করার পরিবর্তে। এটি উপাদানগুলির মধ্যে যুগ্মন হ্রাস করে, ইউনিট টেস্টিং সরল করে এবং ভোক্তা কোড পরিবর্তন না করে বাস্তবায়ন প্রতিস্থাপনের অনুমতি দেয়।
Martin Fowler (2004) অনুসারে, DI হল Inversion of Control-এর একটি নির্দিষ্ট ঘটনা এবং কনস্ট্রাক্টর, প্রপার্টি বা মেথড ইনজেকশনের মাধ্যমে বাস্তবায়িত হয়। Swinject এই প্রক্রিয়াটি স্বয়ংক্রিয় করে, ম্যানুয়ালি ফ্যাক্টরি এবং সার্ভিস লোকেটার লেখার প্রয়োজনীয়তা দূর করে।
তিন বা ততোধিক পরিষেবা সহ প্রকল্পে Swinject ব্যবহার করুন যার ক্রস-নির্ভরতা রয়েছে, যেখানে ম্যানুয়াল অবজেক্ট নির্মাণ ইনিশিয়ালাইজেশন কোড ফুলিয়ে দেয় এবং পরীক্ষাযোগ্যতা হ্রাস করে।
Swinject Apple ইকোসিস্টেমের সাথে ঘনিষ্ঠভাবে একীভূত হয় এবং Swift 3.0 থেকে শুরু করে সমস্ত Swift সংস্করণ সমর্থন করে। ফ্রেমওয়ার্ক ব্রিজের মাধ্যমে Objective-C-এর সাথে সামঞ্জস্যপূর্ণ, যা সম্পূর্ণ কোড মাইগ্রেশন ছাড়াই বিদ্যমান মিশ্র-ভাষা প্রকল্পে এটি চালু করার অনুমতি দেয়। এটি বিশেষ করে পাঁচ বছরের বেশি উন্নয়ন ইতিহাস সহ বড় অ্যাপ্লিকেশনের জন্য প্রাসঙ্গিক।
Swinject কন্টেইনার Container ক্লাস দ্বারা বাস্তবায়িত হয়, যা নিবন্ধিত পরিষেবাগুলির রেজিস্ট্রি সংরক্ষণ করে। যখন resolve মেথড কল করা হয়, কন্টেইনার একটি অবজেক্ট তৈরি করে, নিবন্ধন গ্রাফের মাধ্যমে তার সমস্ত নির্ভরতা পুনরাবৃত্তভাবে সমাধান করে।
Container হল কেন্দ্রীয় অবজেক্ট যেখানে বিমূর্ততা এবং তাদের বাস্তবায়নের মধ্যে ম্যাপিং নিবন্ধিত হয়। Service হল একটি প্রোটোকল যা একটি চুক্তি সংজ্ঞায়িত করে, যখন Component হল একটি ক্লাস যা এই প্রোটোকল বাস্তবায়ন করে। নিবন্ধন register মেথড ব্যবহার করে করা হয়, যা সার্ভিস টাইপ এবং একটি ফ্যাক্টরি গ্রহণ করে।
let container = Container()
container.register(Networking.self) { _ in
NetworkService()
}
let service = container.resolve(Networking.self)
resolve মেথড নির্দিষ্ট প্রোটোকলের জন্য নিবন্ধিত কংক্রিট বাস্তবায়নের একটি ইনস্ট্যান্স ফেরত দেয়। যদি একটি নির্ভরতা নিবন্ধিত না হয়, কন্টেইনার উন্নয়নের সময় দ্রুত সমস্যা সনাক্তকরণের জন্য একটি ফ্যাটাল এরর নিক্ষেপ করে।
প্রতিটি নিবন্ধন একটি ফ্যাক্টরি ফাংশন এবং নির্বাচিত স্কোপ সহ একটি এন্ট্রি তৈরি করে। একটি পরিষেবার বিভিন্ন নামে একাধিক নিবন্ধন থাকতে পারে, যা আপনাকে নাম অনুসারে একটি নির্দিষ্ট বাস্তবায়ন নির্বাচন করতে দেয় — বিভিন্ন পরিবেশের (ডেভেলপমেন্ট, স্টেজিং, প্রোডাকশন) জন্য উপযোগী।
নির্ভরতা সমাধান প্রক্রিয়া পুনরাবৃত্তভাবে কাজ করে: যখন কন্টেইনার একটি Component ইনস্ট্যান্স তৈরি করে, এটি তার ইনিশিয়ালাইজার বিশ্লেষণ করে এবং প্রতিটি প্যারামিটারের জন্য সংশ্লিষ্ট টাইপের সাথে resolve কল করে। যদি একটি নির্ভরতারও নিজস্ব নির্ভরতা থাকে, প্রক্রিয়াটি চলতে থাকে যতক্ষণ না সম্পূর্ণ গ্রাফ সম্পূর্ণরূপে তৈরি হয়। নেস্টিং গভীরতা শুধুমাত্র উপলব্ধ মেমরি দ্বারা সীমিত, কিন্তু অনুশীলনে খুব কমই পাঁচ স্তর অতিক্রম করে।
Swinject তিনটি প্রধান নির্ভরতা ইনজেকশন পদ্ধতি সমর্থন করে, প্রতিটি আর্কিটেকচারাল প্রসঙ্গের উপর নির্ভর করে প্রযোজ্য।
Constructor Injection ইনিশিয়ালাইজার প্যারামিটারের মাধ্যমে নির্ভরতা ইনজেক্ট করে। এটি পছন্দের পদ্ধতি, নিশ্চিত করে যে একটি অবজেক্ট তৈরি হওয়ার মুহূর্ত থেকে সর্বদা বৈধ অবস্থায় থাকে। Swinject কনস্ট্রাক্টরে পাস করা সমস্ত নির্ভরতা স্বয়ংক্রিয়ভাবে সমাধান করে।
class LoginViewModel {
private let authService: AuthProtocol
init(authService: AuthProtocol) {
self.authService = authService
}
}
container.register(AuthProtocol.self) { _ in
AuthService()
}
container.register(LoginViewModel.self) { r in
LoginViewModel(authService: r.resolve(AuthProtocol.self)!)
}
Property Injection ইনিশিয়ালাইজেশনের পরে অবজেক্টের প্রপার্টি সেট করে নির্ভরতা ইনজেক্ট করে। এটি ব্যবহার করা হয় যখন একটি নির্ভরতা ঐচ্ছিক হয় বা কনস্ট্রাক্টরের মাধ্যমে পাস করা যায় না, উদাহরণস্বরূপ, Storyboard-এর সাথে কাজ করার সময়, যেখানে view controller স্বয়ংক্রিয়ভাবে তৈরি হয়। Swinject স্পষ্ট resolve কল ছাড়াই রানটাইমে স্বয়ংক্রিয় প্রপার্টি ইনজেকশনের জন্য @Inject অ্যানোটেশন সমর্থন করে।
Property Injection ব্যবহার করার সময়, অবজেক্টে প্রথম অ্যাক্সেসের আগে নির্ভরতা সেট করা হয়েছে তা নিশ্চিত করা গুরুত্বপূর্ণ। অন্যথায়, প্রপার্টি nil থাকবে, যা অপ্রত্যাশিত ক্র্যাশের দিকে নিয়ে যাবে। Swinject Implicitly Unwrapped Optional পদ্ধতি এবং নির্ভরতা গ্রাফ সমাধান পর্যায়ে কঠোর যাচাইয়ের মাধ্যমে এই সমস্যা সমাধান করে।
Method Injection মেথড প্যারামিটারের মাধ্যমে নির্ভরতা ইনজেক্ট করে। এটি সেই পরিষেবাগুলির জন্য ব্যবহৃত হয় যা শুধুমাত্র একটি অপারেশন সম্পাদনের জন্য প্রয়োজন এবং অবজেক্টের স্থায়ী অবস্থা হিসাবে সংরক্ষণ করা উচিত নয়। এটি সর্বনিম্ন সাধারণ কিন্তু কলব্যাক-এর জন্য দরকারী পদ্ধতি।
ObjectScope হল একটি পদ্ধতি যা Swinject কন্টেইনারের ভিতরে তৈরি ইনস্ট্যান্সের জীবনকাল নির্ধারণ করে। ফ্রেমওয়ার্ক ObjectScopeProtocol-এর মাধ্যমে কাস্টম স্কোপ তৈরি করার ক্ষমতা সহ তিনটি অন্তর্নির্মিত স্কোপ প্রদান করে।
graph স্কোপ ডিফল্ট মান। প্রতিটি resolve কল একটি নতুন ইনস্ট্যান্স তৈরি করে যা শুধুমাত্র নির্ভরতা গ্রাফ সমাধানের সময়কালের জন্য বেঁচে থাকে। এটি স্টেটলেস পরিষেবাগুলির জন্য একটি নিরাপদ পছন্দ কারণ এটি ক্যাশিং থেকে মেমরি লিক দূর করে।
container স্কোপ কন্টেইনারের মধ্যে একটি সিঙ্গলটন। ইনস্ট্যান্সটি প্রথম resolve-এ একবার তৈরি হয় এবং পরবর্তী সমস্ত অনুরোধে ফেরত দেওয়া হয়। ভাগ করা অবস্থা সহ পরিষেবাগুলির জন্য উপযুক্ত: ডেটা ক্যাশ, লগার, অ্যাপ্লিকেশন সেটিংস।
transient স্কোপ প্রতিটি resolve কল-এ ক্যাশিং ছাড়াই একটি নতুন ইনস্ট্যান্স তৈরি করে। হালকা অবজেক্টের জন্য ব্যবহৃত হয় যা পুনরায় ব্যবহার করার প্রয়োজন নেই — উদাহরণস্বরূপ, একটি নির্দিষ্ট HTTP অনুরোধ পরিচালনা করা মডিউল।
| স্কোপ | জীবনকাল | প্রস্তাবিত ব্যবহার |
|---|---|---|
| graph | গ্রাফ সমাধানের সময়কালের জন্য | স্টেটলেস পরিষেবা ডিফল্টরূপে |
| container | কন্টেইনারের সম্পূর্ণ জীবনকাল | সিঙ্গলটন: ক্যাশ, লগার, নেটওয়ার্ক ক্লায়েন্ট |
| transient | কোনো ক্যাশিং নেই | একক ব্যবহারের জন্য হালকা অবজেক্ট |
একটি বাস্তব iOS প্রকল্পে Swinject একীভূত করা অ্যাপ্লিকেশন লঞ্চে কন্টেইনার ইনিশিয়ালাইজ করার মাধ্যমে শুরু হয় — AppDelegate বা সিনে। Assembly-এর মাধ্যমে নিবন্ধন কাঠামোবদ্ধ করার পরামর্শ দেওয়া হয়: একটি পৃথক ক্লাস বা স্ট্রাকচার যা সম্পর্কিত পরিষেবাগুলি গ্রুপ করে।
Swift Developer Community জরিপ (2025) অনুসারে, 43% iOS ডেভেলপার বাণিজ্যিক প্রকল্পে নেটওয়ার্ক লেয়ার, রিপোজিটরি এবং নেভিগেশন কোঅর্ডিনেটরের নির্ভরতা পরিচালনার জন্য DI কন্টেইনার ব্যবহার করে। Swinject তার ন্যূনতম সিনট্যাক্স এবং Objective-C সামঞ্জস্যের কারণে সবচেয়ে জনপ্রিয় সমাধান হিসাবে রয়ে গেছে।
Storyboard Injection হল Swinject-এর একটি অনন্য বৈশিষ্ট্য: কন্টেইনার AppDelegate-এ অতিরিক্ত কোড ছাড়াই Storyboard থেকে তৈরি view controller-এ স্বয়ংক্রিয়ভাবে নির্ভরতা ইনজেক্ট করে। এটি init(container:) মেথডের মাধ্যমে UIStoryboard-এ পাস করা একটি বিশেষ resolver ব্যবহার করে, যা view controller তৈরি আটকায় এবং নিবন্ধিত নির্ভরতা ইনজেক্ট করে।
বড় প্রকল্পে, Swinject নেভিগেশন কোঅর্ডিনেটরের সাথে একত্রিত করা যেতে পারে: কোঅর্ডিনেটর কন্টেইনার গ্রহণ করে এবং resolve-এর মাধ্যমে তাদের নির্ভরতা সমাধান করে স্ক্রিন তৈরি করে, পুরো সিনের জন্য একটি একক কনফিগারেশন পয়েন্ট বজায় রাখে।
Assembly আর্কিটেকচার নিবন্ধন সংগঠিত করার জন্য প্রস্তাবিত প্যাটার্ন। প্রতিটি Assembly সম্পর্কিত পরিষেবাগুলি গ্রুপ করে (যেমন, NetworkingAssembly, DatabaseAssembly) এবং অন্যান্য Assembly-এর উপর নির্ভর করতে পারে। কন্টেইনার ইনিশিয়ালাইজ করার সময়, সমস্ত Assembly লোড হয় এবং তাদের পরিষেবাগুলি নিবন্ধন করে, দায়িত্বের স্পষ্ট বিভাজন প্রদান করে এবং ডজনখানেক পরিষেবা সহ বড় প্রকল্পে DI কনফিগারেশনের মাধ্যমে নেভিগেশন সরল করে।
DI গ্রাফ ডিবাগ করার জন্য, Swinject SwinjectPropertyLoader এক্সটেনশন প্রদান করে, যা plist ফাইল থেকে কনফিগারেশন লোড করে, এবং SwinjectStoryboard — UIStoryboard-এর একটি বিশেষ সংস্করণের মাধ্যমে স্টোরিবোর্ড একীকরণ। এই টুলগুলি বিশেষভাবে উপযোগী যখন একটি বিদ্যমান প্রকল্পকে ম্যানুয়াল অবজেক্ট নির্মাণ থেকে DI-তে মাইগ্রেট করা হয়: ডেভেলপার ধীরে ধীরে পরিষেবাগুলি নিবন্ধন করতে পারে, প্রধান ফিচার উন্নয়ন বন্ধ না করে পরীক্ষা এবং সমাধান ত্রুটি লগিংয়ের মাধ্যমে নির্ভরতা গ্রাফ পরীক্ষা করতে পারে।
Swinject স্পষ্ট ফ্যাক্টরি নিবন্ধন ছাড়াই ইনিশিয়ালাইজার প্যারামিটার টাইপের উপর ভিত্তি করে স্বয়ংক্রিয় নির্ভরতা সমাধানের জন্য SwinjectAutoregistration এক্সটেনশনের মাধ্যমে RxSwift এবং Combine-এর সাথে একীকরণও প্রদান করে। এটি সাধারণ পরিষেবাগুলির জন্য নিবন্ধন কোডের পরিমাণ হ্রাস করে: শুধু ফ্যাক্টরি নির্দিষ্ট না করে container.register(ServiceProtocol.self) কল করুন, এবং Swinject Swift রানটাইম দ্বারা প্রদত্ত Signal রিফ্লেকশনের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে ফ্যাক্টরি তৈরি করবে। এই পদ্ধতিটি সেই পরিষেবাগুলির জন্য প্রস্তাবিত যাদের কনস্ট্রাক্টর শুধুমাত্র মৌলিক টাইপ গ্রহণ করে এবং জটিল নির্মাণ লজিকের প্রয়োজন হয় না।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Swinject কোড জেনারেশন বা রিফ্লেকশন ছাড়াই বিশুদ্ধ Swift-এ লেখা হয়েছে। Needle-এর বিপরীতে, এটির সোর্স জেনারেশনের প্রয়োজন নেই, এবং Dip-এর তুলনায়, এটি অন্তর্নির্মিত Storyboard Injection সমর্থন প্রদান করে, যা বিদ্যমান UIKit প্রকল্পে একীকরণ সরল করে।
File — Add Packages মেনুতে Xcode-এর মাধ্যমে URL github.com/Swinject/Swinject দিয়ে প্যাকেজ যোগ করুন। CocoaPods এবং Carthage-এর মাধ্যমেও ইনস্টলেশন উপলব্ধ। ইনস্টলেশনের পরে, Swinject মডিউল ইম্পোর্ট করুন এবং Container ইনস্ট্যান্স তৈরি করুন।
হ্যাঁ, Swinject SwiftUI-এর সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ। নির্ভরতাগুলি View ইনিশিয়ালাইজার বা Environment-এর মাধ্যমে ইনজেক্ট করা হয়, যেখানে কন্টেইনারটি EnvironmentObject হিসাবে পাস করা হয়। Swinject UIKit-এর উপর নির্ভর করে না এবং উভয় ফ্রেমওয়ার্কের সাথে সমানভাবে কাজ করে।
পরীক্ষার জন্য একটি পৃথক কন্টেইনার তৈরি করুন, বাস্তব পরিষেবাগুলি মক দিয়ে প্রতিস্থাপন করুন। Swinject ভোক্তা কোড পরিবর্তন না করে নিবন্ধন ওভাররাইড করার অনুমতি দেয়। প্রতিটি পরীক্ষা ন্যূনতম নির্ভরতা সেট সহ একটি বিচ্ছিন্ন কন্টেইনার পায়।
এনালিটিক্স-এর জন্য, container স্কোপ ব্যবহার করুন যাতে সমস্ত স্ক্রিন একটি ইনস্ট্যান্সের মাধ্যমে ইভেন্ট পাঠায়। এটি বিভিন্ন ভোক্তার মধ্যে ডেটা ডুপ্লিকেশন ছাড়াই একটি ঐক্যবদ্ধ প্রেরণ সারি এবং সঠিক ব্যাচ সমষ্টি অপারেশন নিশ্চিত করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন