আপনি একবার বুঝতে পারবেন যে ডিআই প্রযুক্তি নয়, নিদর্শন এবং নীতি সম্পর্কে ।
ডিআই কনটেইনার-অজোনস্টিক উপায়ে এপিআই ডিজাইন করতে, এই সাধারণ নীতিগুলি অনুসরণ করুন:
একটি ইন্টারফেসে প্রোগ্রাম, বাস্তবায়ন নয়
এই নীতিটি আসলে ডিজাইনের প্যাটার্নগুলির একটি উদ্ধৃতি (যদিও মেমরি থেকে) তবে এটি সর্বদা আপনার আসল লক্ষ্য হওয়া উচিত । ডিআই হ'ল এই পরিণতি অর্জনের একটি উপায় ।
হলিউডের নীতিমালা প্রয়োগ করুন
ডিআই পদগুলিতে হলিউডের নীতিমালা বলছে: ডিআই কনটেইনারকে কল করবেন না, এটি আপনাকে কল করবে ।
আপনার কোডের মধ্যে থেকে কোনও ধারককে কল করে কখনও কখনও নির্ভরতার জন্য জিজ্ঞাসা করবেন না। কনস্ট্রাক্টর ইনজেকশন ব্যবহার করে সুস্পষ্টভাবে এর জন্য জিজ্ঞাসা করুন ।
কনস্ট্রাক্টর ইনজেকশন ব্যবহার করুন
আপনার যখন নির্ভরতা দরকার তখন নির্ধারকের মাধ্যমে স্থিরভাবে এটি জিজ্ঞাসা করুন :
public class Service : IService
{
private readonly ISomeDependency dep;
public Service(ISomeDependency dep)
{
if (dep == null)
{
throw new ArgumentNullException("dep");
}
this.dep = dep;
}
public ISomeDependency Dependency
{
get { return this.dep; }
}
}
লক্ষ্য করুন কীভাবে পরিষেবা শ্রেণি তার আক্রমণকারীদের গ্যারান্টি দেয়। একবার উদাহরণ তৈরি হয়ে গেলে, গার্ড ক্লজ এবং readonly
কীওয়ার্ডের সংমিশ্রণের কারণে নির্ভরতা উপলব্ধ হওয়ার গ্যারান্টিযুক্ত ।
আপনার যদি স্বল্প-কালীন অবজেক্টের প্রয়োজন হয় তবে অ্যাবস্ট্রাক্ট ফ্যাক্টরিটি ব্যবহার করুন
কনস্ট্রাক্টর ইঞ্জেকশনের সাহায্যে ইনজেকশনের উপর নির্ভরশীলতাগুলি দীর্ঘস্থায়ী হতে থাকে তবে কখনও কখনও আপনার স্বল্প-স্থায়ী অবজেক্টের প্রয়োজন হয়, বা কেবল রান-টাইমে পরিচিত একটি মানের উপর নির্ভরশীলতা তৈরি করতে হয়।
দেখুন এই আরও তথ্যের জন্য।
শুধুমাত্র শেষ দায়িত্বশীল মুহুর্তে রচনা করুন
অবজেক্টগুলিকে একেবারে শেষ অবধি ডিউপলড রাখুন। সাধারণত, আপনি অপেক্ষা করতে পারেন এবং অ্যাপ্লিকেশনটির প্রবেশের পয়েন্টে সমস্ত কিছু ওয়্যার করতে পারেন। একে বলা হয় কম্পোজিশন রুট ।
আরও বিশদ এখানে:
ফেকড ব্যবহার করে সরল করুন
আপনি যদি মনে করেন যে ফলস্বরূপ এপিআই নবাগত ব্যবহারকারীদের জন্য খুব জটিল হয়ে ওঠে, আপনি সর্বদা সাধারণ কয়েকটি নির্ভরশীলতা সংমিশ্রণগুলিকে সজ্জিত করে কয়েকটি ফোকাস ক্লাস সরবরাহ করতে পারেন ।
একটি উচ্চ ডিগ্রী আবিষ্কারযোগ্যতার সাথে নমনীয় মুখমণ্ডল সরবরাহ করতে, আপনি সাবলীল নির্মাতাদের সরবরাহ বিবেচনা করতে পারেন। এটার মতো কিছু:
public class MyFacade
{
private IMyDependency dep;
public MyFacade()
{
this.dep = new DefaultDependency();
}
public MyFacade WithDependency(IMyDependency dependency)
{
this.dep = dependency;
return this;
}
public Foo CreateFoo()
{
return new Foo(this.dep);
}
}
এটি কোনও ব্যবহারকারীকে লিখে ডিফল্ট ফু তৈরির অনুমতি দেবে
var foo = new MyFacade().CreateFoo();
তবে এটি খুব আবিষ্কারযোগ্য যে কাস্টম নির্ভরতা সরবরাহ করা সম্ভব এবং আপনি লিখতে পারতেন
var foo = new MyFacade().WithDependency(new CustomDependency()).CreateFoo();
আপনি যদি কল্পনা করে থাকেন যে মাইফ্যাকড শ্রেণিটি অনেকগুলি নির্ভরশীলতার অনেকটা আবদ্ধ করে রাখে, আমি আশা করি এটি স্পষ্ট যে এটি কীভাবে সঠিক ডিফল্টগুলি প্রদান করবে যখন এখনও এক্সটেনসিবিলিটি আবিষ্কারযোগ্য।
এফডব্লিউআইডাব্লু, এই উত্তরটি লেখার অনেক পরে, আমি এগুলির ধারণাগুলি সম্পর্কে প্রসারিত করেছি এবং ডিআই-বন্ধুত্বপূর্ণ গ্রন্থাগারগুলি সম্পর্কে একটি দীর্ঘ ব্লগ পোস্ট এবং ডিআই-ফ্রেন্ডলি ফ্রেমওয়ার্কগুলি সম্পর্কে একটি সহযোগী পোস্ট লিখেছি ।