নির্ভরতা ইনজেকশন (ডিআই) "বন্ধুত্বপূর্ণ" লাইব্রেরি


230

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

প্রশ্নটি হল, গ্রন্থাগারের নকশা করার সর্বোত্তম উপায় কী তা তাই:

  • ডিআই অগ্নোস্টিক - যদিও সাধারণ ডিআই লাইব্রেরির (স্ট্রাকচারম্যাপ, নিনেক্ট ইত্যাদি) এক বা দু'য়ের জন্য প্রাথমিক "সমর্থন" যুক্ত করা যুক্তিসঙ্গত বলে মনে হয়, আমি গ্রাহকরা যে কোনও ডিআই ফ্রেমওয়ার্ক সহ গ্রন্থাগারটি ব্যবহার করতে সক্ষম হবেন বলে আমি চাই।
  • অ-ডিআই ব্যবহারযোগ্য - লাইব্রেরির কোনও গ্রাহক যদি কোনও ডিআই ব্যবহার না করে থাকেন তবে গ্রন্থাগারটি এখনও যতটা সম্ভব ব্যবহার করা সহজ হওয়া উচিত, ব্যবহারকারীকে এই সমস্ত "গুরুত্বহীন" নির্ভরতা তৈরি করতে যে পরিমাণ কাজ করতে হবে তা হ্রাস করতে হবে "বাস্তব" ক্লাস তারা ব্যবহার করতে চায়।

আমার বর্তমান চিন্তাভাবনাটি হ'ল সাধারণ ডিআই লাইব্রেরিগুলির জন্য কয়েকটি "ডিআই রেজিস্ট্রেশন মডিউল" সরবরাহ করা (যেমন স্ট্রাকচারম্যাপ রেজিস্ট্রি, একটি নিনেক্ট মডিউল), এবং একটি সেট বা ফ্যাক্টরি ক্লাস যা নন-ডিআই এবং এই কয়েকটি কারখানায় মিলিত থাকে।

থটস?


ভাঙা লিঙ্ক আর্টিকেলটির নতুন রেফারেন্স (SOLID): butunclebob.com/ArticleS.Uncle
लय.

উত্তর:


360

আপনি একবার বুঝতে পারবেন যে ডিআই প্রযুক্তি নয়, নিদর্শন এবং নীতি সম্পর্কে ।

ডিআই কনটেইনার-অজোনস্টিক উপায়ে এপিআই ডিজাইন করতে, এই সাধারণ নীতিগুলি অনুসরণ করুন:

একটি ইন্টারফেসে প্রোগ্রাম, বাস্তবায়ন নয়

এই নীতিটি আসলে ডিজাইনের প্যাটার্নগুলির একটি উদ্ধৃতি (যদিও মেমরি থেকে) তবে এটি সর্বদা আপনার আসল লক্ষ্য হওয়া উচিত । ডিআই হ'ল এই পরিণতি অর্জনের একটি উপায়

হলিউডের নীতিমালা প্রয়োগ করুন

ডিআই পদগুলিতে হলিউডের নীতিমালা বলছে: ডিআই কনটেইনারকে কল করবেন না, এটি আপনাকে কল করবে

আপনার কোডের মধ্যে থেকে কোনও ধারককে কল করে কখনও কখনও নির্ভরতার জন্য জিজ্ঞাসা করবেন না। কনস্ট্রাক্টর ইনজেকশন ব্যবহার করে সুস্পষ্টভাবে এর জন্য জিজ্ঞাসা করুন ।

কনস্ট্রাক্টর ইনজেকশন ব্যবহার করুন

আপনার যখন নির্ভরতা দরকার তখন নির্ধারকের মাধ্যমে স্থিরভাবে এটি জিজ্ঞাসা করুন :

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();

আপনি যদি কল্পনা করে থাকেন যে মাইফ্যাকড শ্রেণিটি অনেকগুলি নির্ভরশীলতার অনেকটা আবদ্ধ করে রাখে, আমি আশা করি এটি স্পষ্ট যে এটি কীভাবে সঠিক ডিফল্টগুলি প্রদান করবে যখন এখনও এক্সটেনসিবিলিটি আবিষ্কারযোগ্য।


এফডব্লিউআইডাব্লু, এই উত্তরটি লেখার অনেক পরে, আমি এগুলির ধারণাগুলি সম্পর্কে প্রসারিত করেছি এবং ডিআই-বন্ধুত্বপূর্ণ গ্রন্থাগারগুলি সম্পর্কে একটি দীর্ঘ ব্লগ পোস্ট এবং ডিআই-ফ্রেন্ডলি ফ্রেমওয়ার্কগুলি সম্পর্কে একটি সহযোগী পোস্ট লিখেছি ।


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

4
আমি এখনও একটি প্রকল্প খুঁজে পাই যা এই সবগুলি করে ।
মৌরিসিও শেফার

31
ঠিক আছে, আমরা নিরাপদ জায়গায় সফ্টওয়্যারটি কীভাবে বিকাশ করি, তাই আমরা আপনার অভিজ্ঞতাটি ভাগ করি না ...
মার্ক সিম্যান

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

8
এটি সম্ভবত আমি কখনও দেখেছি একক সেরা উত্তর হতে পারে।
নিক হজস

40

"নির্ভরতা ইনজেকশন" শব্দটির কোনও আইওসি পাত্রে বিশেষভাবে কিছু করার নেই, যদিও আপনি তাদের একসাথে উল্লিখিত দেখতে চান tend এর সহজ অর্থ হ'ল পরিবর্তে আপনার কোডটি লেখার পরিবর্তে:

public class Service
{
    public Service()
    {
    }

    public void DoSomething()
    {
        SqlConnection connection = new SqlConnection("some connection string");
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        // Do something with connection and identity variables
    }
}

আপনি এটি লিখুন:

public class Service
{
    public Service(IDbConnection connection, IIdentity identity)
    {
        this.Connection = connection;
        this.Identity = identity;
    }

    public void DoSomething()
    {
        // Do something with Connection and Identity properties
    }

    protected IDbConnection Connection { get; private set; }
    protected IIdentity Identity { get; private set; }
}

এটি হল, আপনি নিজের কোডটি লেখার সময় দুটি জিনিস করেন:

  1. ক্লাসের পরিবর্তে ইন্টারফেসের উপর নির্ভর করুন যখনই আপনি মনে করেন বাস্তবায়ন পরিবর্তনের প্রয়োজন হতে পারে;

  2. ক্লাসের মধ্যে এই ইন্টারফেসগুলির উদাহরণ তৈরি করার পরিবর্তে এগুলি কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে পাস করুন (বিকল্প হিসাবে, তারা পাবলিক প্রোপার্টিগুলিতে অর্পণ করা যেতে পারে; পূর্ববর্তীটি কনস্ট্রাক্টর ইনজেকশন , দ্বিতীয়টি সম্পত্তি ইনজেকশন )।

এর কোনওটিই কোনও ডিআই লাইব্রেরির অস্তিত্বকে অনুমান করে না এবং এটি কোড ব্যতীত আর কোনও লেখা কঠিন করে তোলে না।

আপনি যদি এর উদাহরণ খুঁজছেন তবে। নেট ফ্রেমওয়ার্ক নিজেই আর দেখার দরকার নেই:

  • List<T>প্রয়োগ IList<T>। যদি আপনি নিজের শ্রেণিটি ব্যবহারের জন্য IList<T>(বা IEnumerable<T>) ডিজাইন করেন তবে আপনি অলস-লোডিং, যেমন লিনক থেকে এসকিউএল, লিনক থেকে সত্তা, এবং এনহাইবারনেট মত ধারণার সুবিধা নিতে পারেন, সাধারণত সম্পত্তি ইনজেকশনের মাধ্যমে scenes কিছু ফ্রেমওয়ার্ক ক্লাস আসলে IList<T>একটি কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে গ্রহণ করে যেমন BindingList<T>বেশ কয়েকটি ডেটা বন্ডিং বৈশিষ্ট্যগুলির জন্য ব্যবহৃত হয়।

  • লিনক থেকে এসকিউএল এবং ইএফ সম্পূর্ণরূপে IDbConnectionএবং সম্পর্কিত ইন্টারফেসগুলির চারপাশে নির্মিত হয় , যা পাবলিক কনস্ট্রাক্টরগুলির মাধ্যমে পাস করা যেতে পারে। আপনার এগুলি ব্যবহার করার দরকার নেই, যদিও; ডিফল্ট নির্মাতারা কোথাও একটি কনফিগারেশন ফাইলে বসে সংযোগের স্ট্রিং দিয়ে ঠিকঠাক কাজ করেন।

  • আপনি যদি উইনফর্মসের উপাদানগুলিতে কখনও কাজ করেন তবে আপনি "পরিষেবা" যেমন পছন্দ করেন INameCreationServiceবা করেন সেগুলি ব্যবহার করেন IExtenderProviderService। এমনকি আপনি সত্যিই জানেন কি কি কংক্রিট শ্রেণীর না হয় । .NET আসলে তার নিজস্ব আইওসি ধারক রয়েছে, IContainerযা এর জন্য ব্যবহৃত হয় এবং Componentশ্রেণীর একটি GetServiceপদ্ধতি রয়েছে যা প্রকৃত পরিষেবা লোকেটার। অবশ্যই, কোনও কিছুই আপনাকে IContainerবা সেই নির্দিষ্ট লোকেটার ব্যতীত এই কোনও বা সমস্ত ইন্টারফেস ব্যবহার করতে বাধা দেয় না । পরিষেবাগুলি নিজেরাই কেবল কন্টেইনারটির সাথে আলগাভাবে মিলিত হয়।

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

এবং তাই এবং তাই ঘোষণা. NET- এ পুরো জায়গা জুড়ে আপনি ডিআই খুঁজে পাবেন, সাধারণত এটি এতটাই নির্বিঘ্নে সম্পন্ন হয়েছে যে আপনি এটি ডিআই হিসাবে ভাবেন না।

আপনি যদি সর্বাধিক ব্যবহারের জন্য আপনার ডিআই-সক্ষম সক্ষম লাইব্রেরি ডিজাইন করতে চান তবে সবচেয়ে ভাল পরামর্শ হ'ল লাইটওয়েট ধারক ব্যবহার করে আপনার নিজের ডিফল্ট IoC প্রয়োগকরণ সরবরাহ করা। IContainerএটির জন্য দুর্দান্ত পছন্দ কারণ এটি নিজেই নেট ফ্রেমওয়ার্কের একটি অংশ।


2
ধারকটির আসল বিমূর্ততা আইসনটাইনার নয়, আইসোভারসিভর প্রোভাইডার।
মৌরিসিও শেফার

2
@ মউরিসিও: আপনি অবশ্যই ঠিক বলেছেন, তবে এমন কাউকে বোঝানোর চেষ্টা করুন যিনি কখনই এলডাব্লুসি সিস্টেম ব্যবহার করেননি কেন IContainerএকটি অনুচ্ছেদে কেন কেবল ধারক নয়। ;)
অ্যারোনআউট

হারুন, আপনি ব্যক্তিগত সেট কেন ব্যবহার করেন তা সম্পর্কে কেবল কৌতূহলী; পরিবর্তে কেবল ক্ষেত্রগুলি কেবল পঠনযোগ্য হিসাবে নির্দিষ্ট করার পরিবর্তে?
jr3

@ জিটার: আপনার অর্থ তারা কেন private readonlyক্ষেত্র নয়? এটি দুর্দান্ত যদি তারা কেবলমাত্র ঘোষণাকারী শ্রেণীর দ্বারা ব্যবহৃত হয় তবে ওপি নির্দিষ্ট করে দেয় যে এটি ফ্রেমওয়ার্ক / লাইব্রেরি-স্তরের কোড ছিল, যা সাবক্লাসিংকে বোঝায়। এই জাতীয় ক্ষেত্রে আপনি সাধারণত সাবক্লাসের সংস্পর্শে থাকা গুরুত্বপূর্ণ নির্ভরতা চান। আমি একটি private readonlyক্ষেত্র এবং স্পষ্টত প্রাপ্তি / সেটার সহ একটি সম্পত্তি লিখতে পারতাম , তবে ... একটি উদাহরণে নষ্ট স্থান এবং বাস্তবে বজায় রাখার জন্য আরও কোড, সত্যিকারের সুবিধার জন্য নয়।
অ্যারোনআউট

স্পষ্ট করার জন্য আপনাকে ধন্যবাদ! আমি ধরে নিয়েছি পাঠ্য ক্ষেত্রগুলি শিশু দ্বারা অ্যাক্সেসযোগ্য হবে।
31

5

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

আসল উত্তর অনুসরণ:


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

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

এর খারাপ দিকটি হ'ল আমি কেবল newপরিষেবাটি সরিয়ে নেওয়ার ক্ষমতাটি হারিয়েছি lost এম্বেড থাকা ধারকটি কার্যকর করা সহজ করার জন্য আমি কমন সার্ভিসলোকেটারের উপরও নির্ভরতা নিয়েছিলাম যা আমি এড়াতে পারতাম (ভবিষ্যতে আমি এটি রিফ্যাক্টর করতে পারি)।

এই ব্লগ পোস্টে আরও বিশদ ।

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

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

নীচের লাইন: কোনও নিখুঁত সমাধান নেই। যে কোনও ডিজাইনের সিদ্ধান্তের মতোই এই সমস্যাটি নমনীয়তা, রক্ষণাবেক্ষণযোগ্যতা এবং সুবিধার মধ্যে একটি ভারসাম্য দাবি করে।


12
আমি আপনার মতামতকে শ্রদ্ধা করার সময়, আমি খুঁজে পেয়েছি আপনার অতিরিক্ত-জেনারেলাইজড "অন্য সমস্ত উত্তর এখানে পুরানো এবং এড়ানো উচিত" অত্যন্ত নির্বোধ। এরপরে আমরা যদি কিছু শিখি তবে তা নির্ভরতা ইঞ্জেকশন ভাষা সীমাবদ্ধতার একটি উত্তর। আমাদের বর্তমান ভাষাগুলি বিকশিত বা ত্যাগ না করেই মনে হয় আমাদের আর্কিটেকচার সমতল করতে এবং মডুলারালিটি অর্জনের জন্য আমাদের ডিআইয়ের প্রয়োজন হবে । আইওসি একটি সাধারণ ধারণা হিসাবে এই লক্ষ্যগুলির কেবলমাত্র একটি পরিণতি এবং অবশ্যই একটি কাঙ্ক্ষিত। আইওসি পাত্রে আইওসি বা ডিআই-তে উভয়ই একেবারে প্রয়োজনীয় নয় এবং তাদের দরকারীতা আমরা তৈরি মডিউল রচনাগুলির উপর নির্ভর করে।
tne

@ আমার আপনার "অত্যন্ত নির্বোধ" হওয়ার কথা উল্লেখ করা একটি স্বাগত-স্বাগত বিজ্ঞাপন is আমি সি #, ভিবি.এনইটি, জাভাতে ডিআই বা আইওসি ছাড়াই জটিল অ্যাপ্লিকেশন লিখেছি (আপনার বর্ণনায় আইওসি আপাতভাবে বিচার করে এমন ভাষাগুলি আপনার মনে হয় "), এটি অবশ্যই ভাষার সীমাবদ্ধতার বিষয়ে নয়। এটা ধারণাগত সীমাবদ্ধতা সম্পর্কে। আমি আপনাকে বিজ্ঞাপন-হোমনেম আক্রমণ এবং দুর্বল যুক্তিগুলি অবলম্বন না করে ক্রিয়ামূলক প্রোগ্রামিং সম্পর্কে জানতে আমন্ত্রণ জানিয়েছি।
মরিসিও শ্যাফার

18
আমি উল্লেখ করেছি যে আমি আপনার বক্তব্য নিষ্কলঙ্ক বলে মনে করেছি; এটি ব্যক্তিগতভাবে আপনার সম্পর্কে কিছুই বলে না এবং এটি আমার মতামত সম্পর্কে। দয়া করে কোনও এলোমেলো অপরিচিত ব্যক্তির দ্বারা অবমাননা বোধ করবেন না। আমি প্রাসঙ্গিক সমস্ত কার্যনির্বাহী প্রোগ্রামিং পদ্ধতির সম্পর্কে অজ্ঞ তা বোঝানোও কার্যকর নয়; আপনি এটি জানেন না, এবং আপনি ভুল হতে হবে। আমি জানতাম যে আপনি সেখানে জ্ঞানী ছিলেন (দ্রুত আপনার ব্লগের দিকে নজর দিয়েছিলেন), এ কারণেই আমি বিরক্তিকর বলে মনে করেছি যে একটি আপাতদৃষ্টিতে জ্ঞাত জ্ঞাত ব্যক্তি "আমাদের আইওসি দরকার নেই" এর মতো কথা বলবে। আইওসি কার্যকরী প্রোগ্রামিং সর্বত্র আক্ষরিক ঘটে (..)
tne

4
এবং সাধারণভাবে উচ্চ-স্তরের সফ্টওয়্যার। প্রকৃতপক্ষে, কার্যকরী ভাষা (এবং অন্যান্য অনেক শৈলী) সত্যই প্রমাণ করে যে তারা ডিআই ছাড়াই আইওসি সমাধান করে, আমি মনে করি আমরা উভয়ই এর সাথে একমত, এবং এটাই আমি বলতে চেয়েছিলাম। আপনি যে ভাষাগুলির উল্লিখিত ভাষায় ডিআই ব্যতীত পরিচালনা করেন, আপনি এটি কীভাবে করলেন? আমি ব্যবহার করে না অনুমান ServiceLocator। যদি আপনি কার্যকরী কৌশল প্রয়োগ করেন তবে আপনি সমাপ্তির সমতুল্য, যা নির্ভরতা-ইনজেকশন ক্লাস (যেখানে নির্ভরতাগুলি ক্লোড-ওভার ভেরিয়েবলগুলি হয়) সমাপ্ত হয়। কিভাবে অন্য? (আমি সত্যই কৌতূহলী, কারণ আমিও ডিআই পছন্দ করি না))
টেন

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

1

আমি যা করব তা হ'ল আমার লাইব্রেরিটি একটি ডিআই কনটেইনার অজ্ঞেয় পদ্ধতিতে ডিজাইন করা যাতে ধারকটির উপর নির্ভরতা যতটা সম্ভব সীমাবদ্ধ করা যায়। এটি অন্য প্রয়োজনের জন্য ডিআই কনটেইনারকে সরিয়ে নিতে দেয়।

তারপরে লাইব্রেরির ব্যবহারকারীদের কাছে ডিআই যুক্তির উপরে স্তরটি প্রকাশ করুন যাতে আপনার ইন্টারফেসের মাধ্যমে আপনি যে ফ্রেমওয়ার্কটি বেছে নেন তা তারা ব্যবহার করতে পারে। এইভাবে তারা আপনার প্রকাশিত ডিআই কার্যকারিতাটি এখনও ব্যবহার করতে পারে এবং তারা তাদের নিজস্ব উদ্দেশ্যে অন্য কোনও কাঠামো ব্যবহার করতে মুক্ত।

গ্রন্থাগারের ব্যবহারকারীদের নিজস্ব ডিআই ফ্রেমওয়ার্ক প্লাগ করতে দেওয়া আমার কাছে কিছুটা ভুল বলে মনে হচ্ছে কারণ এটি নাটকীয়ভাবে রক্ষণাবেক্ষণের পরিমাণ বৃদ্ধি করে। এটি তখন সরাসরি ডিআই এর চেয়ে বেশি প্লাগইন পরিবেশে পরিণত হয়।

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