আইওসি / ডিআই - আমাকে আবেদনের প্রবেশের পয়েন্টে সমস্ত স্তর / সমাবেশগুলি কেন উল্লেখ করতে হবে?


123

(এই প্রশ্নের সাথে সম্পর্কিত, EF4: অলস লোডিং সক্ষম করার সময় কেন প্রক্সি তৈরি সক্ষম করতে হবে? )।

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

আমি যদি ডিআই কনটেইনার ব্যবহার না করতাম তবে আমার এমভিসি 3 অ্যাপে আমাকে কেবলমাত্র আমার ব্যবসায়িক স্তর, যা আমার ডাল / রেপো স্তরটিকে রেফারেন্স দেবে এন্টি ফ্রেমওয়ার্ক গ্রন্থাগারটি উল্লেখ করতে হবে না।

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


1
নেট মধ্যে ডিপেন্ডেন্সি ইনজেকশন বইয়ের এই অংশটি , দ্বিতীয় সংস্করণটি মার্ক এবং আমার উভয়ের উত্তরের আরও বিস্তৃত সংস্করণ। এটি কম্পোজিশন রুটের ধারণা সম্পর্কে এবং বিশদটি বর্ণনা করে যে কেন অ্যাপ্লিকেশনটির প্রারম্ভিক পথটিকে অন্য প্রতিটি মডিউলের উপর নির্ভর করতে দেওয়া আসলে একটি ভাল জিনিস।
স্টিভেন

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

উত্তর:


194

আমি যদি ডিআই কনটেইনার ব্যবহার না করতাম তবে আমার এমভিসি 3 অ্যাপে আমাকে এনটিটি ফ্রেমওয়ার্ক লাইব্রেরিটি উল্লেখ করতে হবে না, কেবল আমার ব্যবসায় স্তর যা আমার ডাল / রেপো স্তরটিকে রেফারেন্স করবে।

হ্যাঁ, পরিস্থিতি ঠিক এটাই এড়াতে ডিআই খুব পরিশ্রম করে :)

শক্তভাবে সংযুক্ত কোডের সাথে প্রতিটি গ্রন্থাগারে কেবল কয়েকটি রেফারেন্স থাকতে পারে তবে এগুলিতে আবার অন্যান্য উল্লেখ থাকতে পারে, এর ফলে নির্ভরতার গভীর গ্রাফ তৈরি হয়:

ডিপ গ্রাফ

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

যাইহোক, একটি শিথিলভাবে যুগল প্রয়োগে, সমস্ত উল্লেখগুলি রচনা রোটের সাথে সরিয়ে , নির্ভরতা গ্রাফটি কঠোরভাবে সমতল করা হয় :

অগভীর গ্রাফ

সবুজ রঙ দ্বারা চিত্রিত হিসাবে, এখন অযাচিত নির্ভরতার সাথে টেনে না রেখে লাইব্রেরি সি পুনরায় ব্যবহার করা সম্ভব ।

যাইহোক, যে সব অনেক Di পাত্রে সঙ্গে, বলল, তুমি না আছে সব প্রয়োজনীয় লাইব্রেরি কঠিন রেফারেন্স যোগ করতে। পরিবর্তে, আপনি কনভেনশন-ভিত্তিক এসেম্বলি-স্ক্যানিং (পছন্দসই) বা এক্সএমএল কনফিগারেশন আকারে দেরীতে বাইন্ডিং ব্যবহার করতে পারেন ।

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

এই উত্তরের আরও বিস্তৃত সংস্করণটি আমার নির্ভরশীল ইনজেকশন বই , নীতিমালা, অনুশীলনগুলি, প্যাটার্নগুলি থেকে এই উদ্ধৃতিটিতে পাওয়া যাবে ।


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

2
@ মার্ক সিমান এই প্রশ্ন / উত্তরটি কি মাইক্রোসফ্টের জন্য নির্দিষ্ট? আমি জানতে চাই যে "আবেদনের প্রবেশের বিন্দুতে" সমস্ত নির্ভরতা সরিয়ে নেওয়ার এই ধারণাটি ম্যাভেন ব্যবহার করে একটি জাভা ইই / স্প্রিং প্রকল্পে অর্থবোধ করে ... ধন্যবাদ!
গ্রাগোয়ার সি

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

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

4
একটি সাধারণ নিয়ম হিসাবে, ইন্টারফেসগুলি ক্লায়েন্টগুলি তাদের ( এপিএপি, চ। ১১ ) ব্যবহার করে সংজ্ঞায়িত করতে হবে , সুতরাং লাইব্রেরি জে যদি একটি ইন্টারফেসের প্রয়োজন হয় তবে এটি লাইব্রেরি জে সংজ্ঞায়িত করা উচিত That's এটি নির্ভরতা বিপরীতমুখী মূলনীতিটির একটি অনুসারী ol
মার্ক সিমেন

65

আমি যদি ডিআই কনটেইনার ব্যবহার না করতাম তবে আমার এমভিসি 3 অ্যাপে আমাকে এনটিটি ফ্রেমওয়ার্ক লাইব্রেরিটি উল্লেখ করতে হবে না

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

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

ক্লাস লাইব্রেরিতে উপস্থাপনার যুক্তি সরিয়ে নেওয়া এমভিসির সাথে কাজ করার সময় জিনিসগুলিকে জটিল করে তুলতে পারে। নিয়ন্ত্রণকারীরা স্টার্টআপ প্রজেক্টে না থাকায় সমস্ত কিছু তারের কাজটি শক্ত করা শক্ত হবে (যদিও ভিউ, চিত্র, সিএসএস ফাইলগুলি সম্ভবত স্টার্টআপ প্রজেক্টে থাকতে হবে)। এটি সম্ভবত করণীয় তবে সেট আপ করতে আরও সময় লাগবে।

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

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

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

আমার বই ডিপেন্ডেন্সি ইনজেকশন, নীতিমালা, অনুশীলন, প্যাটার্নসের ৪ র্থ অধ্যায়ে কীভাবে কম্পোজিশন রুট কাজ করে সে সম্পর্কে আপনি আরও বিস্তৃত আলোচনা পড়তে পারেন ।


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

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

6

আমি যদি ডিআই কনটেইনার ব্যবহার না করতাম তবে আমার এমভিসি 3 অ্যাপে আমাকে এনটিটি ফ্রেমওয়ার্ক লাইব্রেরিটি উল্লেখ করতে হবে না, কেবল আমার ব্যবসায় স্তর যা আমার ডাল / রেপো স্তরটিকে রেফারেন্স করবে।

আপনি "DependencyResolver" নামে একটি পৃথক প্রকল্প তৈরি করতে পারেন। এই প্রকল্পে আপনাকে আপনার সমস্ত লাইব্রেরি উল্লেখ করতে হবে।

এখন UI স্তরটির জন্য NHibernate / EF বা ক্যাসল উইন্ডসর ব্যতীত অন্য কোনও UI সম্পর্কিত গ্রন্থাগারের প্রয়োজন নেই d

আপনি যদি আপনার ইউআই স্তর থেকে ক্যাসল উইন্ডসর এবং নির্ভরতা রিসোলভারটি আড়াল করতে চান তবে আপনি একটি HTTPModule লিখতে পারেন যা আইওসি রেজিস্ট্রি স্টাফকে কল করে।

স্ট্রাকচারম্যাপের জন্য আমার কাছে কেবল উদাহরণ রয়েছে:

public class DependencyRegistrarModule : IHttpModule
{
    private static bool _dependenciesRegistered;
    private static readonly object Lock = new object();

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (sender, args) => EnsureDependenciesRegistered();
    }

    public void Dispose() { }

    private static void EnsureDependenciesRegistered()
    {
        if (!_dependenciesRegistered)
        {
            lock (Lock)
            {
                if (!_dependenciesRegistered)
                {
                    ObjectFactory.ResetDefaults();

                    // Register all you dependencies here
                    ObjectFactory.Initialize(x => x.AddRegistry(new DependencyRegistry()));

                    new InitiailizeDefaultFactories().Configure();
                    _dependenciesRegistered = true;
                }
            }
        }
    }
}

public class InitiailizeDefaultFactories
{
    public void Configure()
    {
        StructureMapControllerFactory.GetController = type => ObjectFactory.GetInstance(type);
          ...
    }
 }

ডিফল্টকন্ট্রোলারফ্যাক্টরি সরাসরি আইওসি পাত্রে ব্যবহার করে না, তবে এটি আইওসি ধারক পদ্ধতিতে প্রতিনিধিত্ব করে।

public class StructureMapControllerFactory : DefaultControllerFactory
{
    public static Func<Type, object> GetController = type =>
    {
        throw new  InvalidOperationException("The dependency callback for the StructureMapControllerFactory is not configured!");
    };

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            return base.GetControllerInstance(requestContext, controllerType);
        }
        return GetController(controllerType) as Controller;
    }
}

GetControllerপ্রতিনিধি (উইন্ডসর এটা একটি ইনস্টলার হওয়া উচিত) একটি StructureMap রেজিস্ট্রিতে সেট করা হয়।


1
আমি যা করতে পেরেছি তার থেকেও এটি আমার চেয়ে ভাল, মডিউলগুলি দুর্দান্ত। তাহলে আমি কন্টেইনারে কল করব কোথায়? ডিসপোজ ()? মডিউলটির মধ্যে অ্যাপ্লিকেশন বা সমাপ্তির ইভেন্টটি ...?
ডায়গোহব

1
@ স্টিভেন কারণ গ্লোবাল.অ্যাসাক্স আপনার এমভিসি ইউআই স্তরতে রয়েছে। এইচটিপিএমডিউলটি নির্ভরতা পুনর্বিবেচনা প্রকল্পে থাকবে।
রুকিয়ান

1
সামান্য সুবিধা হ'ল যে কেউ ইউআই-তে আইওসি ধারক ব্যবহার করতে পারে না। অর্থাৎ কেউ ইউআইতে সার্ভিস লোকেটার হিসাবে আইওসি কনটেইনারটি ব্যবহার করতে সক্ষম নয়।
রুকিয়ান

1
এছাড়াও, এটি ইউআই স্তরে সমাবেশের কোনও শক্ত উল্লেখ নেই বলে দুর্ঘটনাক্রমে ইউআই স্তরটিতে ডাল কোড ব্যবহার করা বিকাশকারীদের বারণ করে।
ডায়গোহব

1
বুটস্ট্র্যাপারের জেনেরিক রেজিস্ট্রেশন এপিআই ব্যবহার করে কীভাবে একই জিনিসটি করা যায় তা আমি খুঁজে বের করেছি। আমার ইউআই প্রকল্প বুটস্ট্র্যাপার, নির্ভরতা রেজোলিউশন প্রকল্প যেখানে আমি আমার রেজিস্ট্রেশনগুলি এবং আমার কোর (ইন্টারফেসগুলির জন্য) তে প্রকল্পগুলি উল্লেখ করি, কিন্তু আমার ডিআই ফ্রেমওয়ার্ক (সিম্পল ইনজেক্টর) তেমন কিছুই না। আমি বিন ফোল্ডারে dlls অনুলিপি করতে আউটপুটটো নুগেট ব্যবহার করছি।
ডাইগোহব

0
  • একটি নির্ভরতা রয়েছে: যদি কোনও বস্তু অন্য কোনও বস্তুকে তাত্পর্যপূর্ণ করে।
  • কোনও নির্ভরতা নেই: যদি কোনও বস্তু কোনও বিমূর্ততা আশা করে (কনট্রাক্টর ইঞ্জেকশন, পদ্ধতি ইনজেকশন ...)
  • বিধানসভা রেফারেন্স (রেফারেন্সিং ডিএল, ওয়েবসার্ভিস ..) নির্ভরতা ধারণা থেকে স্বতন্ত্র, কারণ একটি বিমূর্ততা সমাধান করতে এবং কোডটি সংকলন করতে সক্ষম হতে, স্তরটিকে অবশ্যই এটি উল্লেখ করতে হবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.