এন-টিয়ার সত্তা ফ্রেমওয়ার্ক সমাধান সহ নির্ভরতা ইনজেকশন


12

আমি বর্তমানে একটি এন-টিয়ার সমাধান ডিজাইন করছি যা সত্তা ফ্রেমওয়ার্ক 5 (। নেট 4) এর ডেটা অ্যাক্সেস কৌশল হিসাবে ব্যবহার করছে তবে এটি কীভাবে নির্ভরযোগ্যতা ইঞ্জেকশনটিকে পরীক্ষণযোগ্য / নমনীয় করে তুলবে তা সম্পর্কে উদ্বিগ্ন।

আমার বর্তমান সমাধান বিন্যাস নিম্নরূপে রয়েছে (আমার সমাধানটিকে আলকাত্রাজ বলা হয়):

অ্যালকাট্রাজ.উইউবিআইআই : একটি এস্প নেট ওয়েবসাইট ওয়েবফর্ম প্রকল্প, ফ্রন্ট এন্ড ইউজার ইন্টারফেস, আলকাট্রাজ.ব্যসনেস এবং অ্যালকাট্রাজ.ডাটা.মোডেলস সম্পর্কিত প্রকল্পগুলি উল্লেখ করে ।

আলকাট্রাজ.ব্যাজনেস : একটি শ্রেণিকালীন গ্রন্থাগার প্রকল্প, ব্যবসায় যুক্তি যুক্ত করে, আলকাট্রাজ.ডাটা.অ্যাক্সেস , আলকাট্রাজ.ডাটা.মোডেলস

অ্যালকাট্রাজ.ডাটা.অ্যাক্সেস : একটি শ্রেণিবদ্ধ গ্রন্থাগার প্রকল্পে আলকাট্রাজমডেল.এডএমএক্স এবং AlcatrazEntitiesডিবি কনটেক্সট রয়েছে, রেফারেন্স প্রকল্পসমূহ আলকাট্রাজ.ডাটা.মোডেলস

অ্যালকাট্রাজ.ডাটা.মোডেলস : একটি শ্রেণিকালীন গ্রন্থাগার প্রকল্পে আলকাট্রাজ মডেলের জন্য পোকো রয়েছে, কোনও উল্লেখ নেই।

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

ব্যবসায় প্রকল্পে:

public class InmateRepository : IInmateRepository
{
    private string _connectionString;

    public InmateRepository(string connectionString)
    {
        if (connectionString == null)
        {
            throw new ArgumentNullException("connectionString");
        }

        EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();

        connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
        connectionBuilder.Provider = "System.Data.SqlClient";
        connectionBuilder.ProviderConnectionString = connectionString;

        _connectionString = connectionBuilder.ToString();
    }

    public IQueryable<Inmate> GetAllInmates()
    {
        AlcatrazEntities ents = new AlcatrazEntities(_connectionString);

        return ents.Inmates;
    }
}

ওয়েব ইউআইতে:

IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");

List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();

এই নকশাটি সম্পর্কে আমার কয়েকটি সম্পর্কিত প্রশ্ন রয়েছে।

  1. সত্তা ফ্রেমওয়ার্কের ক্ষমতাগুলির ক্ষেত্রেও এই নকশাটি কী অর্থবোধ করে? আমি শুনেছি যে সত্তা কাঠামোটি ইতিমধ্যে ইউনিট-অফ-ওয়ার্ক প্যাটার্ন ব্যবহার করে, আমি কি অযৌক্তিকভাবে বিমূর্তের অন্য স্তরটি যুক্ত করছি?

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

  3. ব্যবসায়ের স্তরটিতে এমনকি ভান্ডারগুলিও থাকা উচিত, বা এটি অ্যাক্সেস স্তরের মধ্যে থাকা উচিত? যদি তারা ঠিকঠাক থাকে তবে অনুমান করার জন্য কোনও সংযোগের স্ট্রিংটি কি নির্ভর করে?

পড়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ!

উত্তর:


11

আপনি যেভাবে ডিআই করছেন তা ভুল।

প্রথমত, সংযোগের স্ট্রিং ডেটা স্তরের অন্তর্গত। অথবা ওয়েবকনফিগ ফাইলে।

আপনি যে পরবর্তী বিমূর্ততাটি নিয়ে কাজ করবেন সেটি হ'ল ডিবি কনটেক্সট, সংযোগের স্ট্রিং নয়। আপনার সংগ্রহস্থলগুলির সংযোগের স্ট্রিং সম্পর্কে জানা উচিত নয়। আপনার ব্যবসায়ের যুক্তি DbContext ইত্যাদি সম্পর্কে জানতে পারবেন না

আপনার ইউআইয়ের কোনও ধারণা থাকবে না এবং ইএফ সম্পর্কিত কোনও কিছু ইনস্ট্যান্টিয়েট করবে না।

আপনার পয়েন্টের কংক্রিট উত্তর:

  1. আপনি EF এর সাথে খুব পরিচিত না হওয়া পর্যন্ত বিমূর্ততা যুক্ত করবেন না। এটি ইতিমধ্যে ইউওডাব্লু, কোয়েরি, পিওসিও ব্যবহার ইত্যাদি ভাল বিমূর্ততা যুক্ত করেছে

  2. ডিআই কাজ করার জন্য, আপনার কাছে একটি কম্পোজিশন রুট রয়েছে যা প্রয়োজনীয় সমস্ত উপাদানকে রেফার করে। এটি WebUI প্রকল্পে থাকতে পারে বা নাও হতে পারে। যদি তা না হয় তবে আপনার আশা করা উচিত যে এটি EF বা অন্য কোনও ডেটা সম্পর্কিত প্রযুক্তি সম্পর্কিত রেফারেন্স দেয় না।

  3. এখানেই থামো। বিমূর্ততা উপর বিমূর্ততা যোগ করা বন্ধ করুন। সরাসরি এবং 'নিষ্পাপ' আর্কিটেকচার দিয়ে শুরু করুন এবং সময়ের সাথে সাথে এটি বিকাশ করুন।

বিমূর্ততা জটিলতার সাথে মোকাবিলা করার একটি সরঞ্জাম। জটিলতার অনুপস্থিতি অর্থ কোনও বিমূর্ততা প্রয়োজন (এখনও)।


আপনি কী বলছেন তা আমি বুঝতে পেরেছি: রিপোজিটরি (যা ইন্টারফেস ব্যবসায় রয়েছে এবং আলকাত্রাজ.ডাটা.অ্যাকসেস?) DbContextএটিকে নির্ভরতা হিসাবে গ্রহণ করে । নির্ভরশীলতা হিসাবে ব্যবসায়িক শ্রেণীর সংগ্রহস্থল রয়েছে। নির্ভরতা ইনজেকশনের জন্য, আমি এটি ম্যানুয়ালি করছি (তাই আমি বুঝতে পারি কী চলছে)। যে কারণে আমি সংযোগের স্ট্রিংটি সেট করতে সক্ষম হতে চাই তা DbContextহ'ল আমি ডাটাবেস শাড়িং ব্যবহার করি তাই নির্দিষ্ট ক্ষেত্রে আমার কাছে বিভিন্ন ডাটাবেসের সাথে (একই কাঠামোর) সংযোগের জন্য সত্তা কাঠামো থাকা দরকার। আমি কি আপনাকে সঠিকভাবে বুঝতে পারি?
ম্যাথু

আপনার প্রদত্ত কোডটি থেকে মনে হচ্ছে আপনি মোটেও ডিআই করছেন না। ডিআই এর মূল উদ্দেশ্য হ'ল আপনাকে এবং আপনার কোডকে নির্ভরতাগুলি পরিচালনা করা থেকে মুক্ত করা। আপনি কোনও ডিআই কন্টেনার ছাড়াই ম্যানুয়ালি কার্যকরভাবে এটি করছেন তা আমি ভাবতে পারি না।
বরিস ইয়াঙ্কভ

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

4

কয়েকটি দ্রুত মন্তব্য। আমি ব্যক্তিগতভাবে সম্ভবত একটি সংযোগ স্ট্রিং পাস না। যদি আমি চেষ্টা করি এবং সংগ্রহস্থলগুলির জন্য ইন্টারফেসগুলি তৈরি করতে পারি এবং কেবল ইন্টারফেসগুলি প্রায় পাস করতে পারি? ভান্ডারগুলি আইওডু ইন্টারফেসটি কার্যকর করতে বা প্রকাশ করতে হবে।

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

সুতরাং আপনার কয়েকটি প্রশ্নের উত্তরে:

  1. হ্যাঁ, আমি মনে করি এটি ঠিক আছে
  2. আমার কাছে এখনও ইউআই রেফারেন্স EF প্রকল্প এবং বায়সনে স্তর রেফারেন্স ইন্টারফেস থাকতে পারে যা EF সংগ্রহস্থল স্তর প্রয়োগ করে। এইভাবে অন্যান্য প্রকল্পগুলি এখনও একই সমাহারগুলি ব্যবহার করতে পারে তবে তাদের যদি ইচ্ছা হয় তবে অদলবদল করার নমনীয়তা রয়েছে?
  3. হুঁ, সম্ভবত অ্যাক্সেস লেয়ারের সংগ্রহস্থলগুলি কিন্তু ব্যবসায়ের স্তরে প্রকাশিত একটি ইন্টারফেস সংজ্ঞা বাস্তবায়ন করা ??

এগুলি বিস্মৃত হওয়ার জন্য কেবল কিছু চিন্তাভাবনা।


পয়েন্ট ২ সম্পর্কে, আমি যে লক্ষ্যটি তৈরির চেষ্টা করছিলাম তা হ'ল ইউআই স্তরের মধ্যে সিআরইউডি না থাকা। আমার অর্থ হ'ল আমি নিশ্চিত করতে চাই যে কেবলমাত্র সিআরইউডি ব্যবসায়ের স্তরের মধ্য দিয়ে যেতে পারে, এটি পরিচালনা করা হয়।
ম্যাথু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.