ASP.NET অ্যাপ্লিকেশন বিকাশকালে কি কি সিকিউআরএস / মেডিয়েটআর উপযুক্ত?


17

আমি ইদানীং সিকিউআরএস / মেডিয়েটআর সন্ধান করছি। তবে আমি যতটা পছন্দ করি তত কম ড্রিল করি। সম্ভবত আমি কিছু / সবকিছু ভুল বুঝেছি।

সুতরাং এটিতে আপনার নিয়ামককে হ্রাস করার দাবি করে দারুণ শুরু হয়

public async Task<ActionResult> Edit(Edit.Query query)
{
    var model = await _mediator.SendAsync(query);

    return View(model);
}

যা পাতলা নিয়ামক নির্দেশিকাটির সাথে পুরোপুরি ফিট করে। তবে এটি বেশ কয়েকটি গুরুত্বপূর্ণ বিবরণ ছেড়ে দেয় - ত্রুটি পরিচালনা করা।

Loginনতুন এমভিসি প্রকল্পের ডিফল্ট ক্রিয়াটি দেখে নেওয়া যাক

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            _logger.LogInformation(1, "User logged in.");
            return RedirectToLocal(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning(2, "User account locked out.");
            return View("Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return View(model);
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

রূপান্তর করা যা বাস্তব জগতের সমস্যার একগুচ্ছ আমাদের উপস্থাপন করে। মনে রাখবেন লক্ষ্যটি এটি হ্রাস করা

public async Task<IActionResult> Login(Login.Command command, string returnUrl = null)
{
    var model = await _mediator.SendAsync(command);

    return View(model);
}

এর সম্ভাব্য সমাধান হ'ল একটি এর CommandResult<T>পরিবর্তে একটি ফেরত দেওয়া modelএবং তারপরে CommandResultপোস্ট অ্যাকশন ফিল্টারটিতে হ্যান্ডেল করা । যেমনটি এখানে আলোচনা করা হয়েছে

এর একটি বাস্তবায়ন এর মতো CommandResultহতে পারে

public interface ICommandResult  
{
    bool IsSuccess { get; }
    bool IsFailure { get; }
    object Result { get; set; }
}

সূত্র

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

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

ফিরে আসার ত্রুটি বার্তাগুলির পাশাপাশি মডেল বৈধতা আরও জটিল হয়ে উঠেছে। একটি উদাহরণ হিসাবে এটি গ্রহণ করুন

else
{
    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    return View(model);
}

আমরা মডেলের সাথে একটি ত্রুটি বার্তা সংযুক্ত করি। Exceptionকৌশলটি ব্যবহার করে এই ধরণের জিনিসটি করা যায় না ( এখানে প্রস্তাবিত হিসাবে) ) কারণ আমাদের মডেলটি প্রয়োজন। সম্ভবত আপনি মডেলটি পেতে পারেন Requestতবে এটি একটি খুব জড়িত প্রক্রিয়া হবে।

সুতরাং সর্বোপরি আমার এই "সাধারণ" ক্রিয়াটি রূপান্তর করতে খুব কষ্ট হচ্ছে।

আমি ইনপুট খুঁজছি আমি কি এখানে পুরোপুরি ভুল করছি?


6
আপনি ইতিমধ্যে প্রাসঙ্গিক উদ্বেগগুলি বেশ ভালভাবে বুঝতে পারছেন বলে মনে হচ্ছে। সেখানে প্রচুর "সিলভার বুলেট" রয়েছে যেগুলির খেলনার উদাহরণ রয়েছে যা তাদের কার্যকারিতা প্রমাণ করে, তবে যা প্রকৃত, বাস্তব জীবনের প্রয়োগের বাস্তবতায় ডুবে গেলে অনিবার্যভাবে পড়ে যায়।
রবার্ট হার্ভে

মেডিয়েটআর আচরণগুলি দেখুন। এটি মূলত একটি পাইপলাইন যা আপনাকে ক্রস কাটিয়া উদ্বেগগুলি মোকাবেলায় সহায়তা করে।
এফএমএল

উত্তর:


14

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

আমি মনে করি আপনি প্রমাণীকরণে সিকিউআরএস প্যাটার্নটি ভুলভাবে প্রয়োগ করছেন। লগইন সহ এটি সিকিউআরএসে একটি কমান্ড হিসাবে মডেল করা যাবে না কারণ এটি

কমান্ডগুলি: একটি সিস্টেমের অবস্থা পরিবর্তন করুন তবে কোনও মান ফিরিয়ে দেবেন না
- মার্টিন ফোলার কমান্ডকোয়ারিসেরাপারেশন

আমার মতে প্রমাণীকরণ CQRS এর জন্য একটি দরিদ্র ডোমেন domain প্রমাণীকরণের সাথে আপনার দৃ strongly়ভাবে সামঞ্জস্যপূর্ণ, সিঙ্ক্রোনাস অনুরোধ-প্রতিক্রিয়া প্রবাহ প্রয়োজন যাতে আপনি 1. ব্যবহারকারীর শংসাপত্রগুলি পরীক্ষা করতে পারেন 2. ব্যবহারকারীর জন্য একটি সেশন তৈরি করুন you've. আপনি চিহ্নিত করেছেন এমন প্রান্তের যে কোনও ক্ষেত্রে পরিচালনা করুন immediately অবিলম্বে ব্যবহারকারীকে মঞ্জুর করুন বা অস্বীকার করুন উত্তরে.

ASP.NET অ্যাপ্লিকেশন বিকাশকালে কি কি সিকিউআরএস / মেডিয়েটআর উপযুক্ত?

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

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

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

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


1
আমি 100% একমত। সিকিউআরএস কিছুটা হাইপাইড, তাই আমি ভেবেছিলাম যে "তারা" এমন কিছু দেখেছিল যা আমি পাইনি। কারণ সিআরইউডি ওয়েব অ্যাপ্লিকেশনগুলিতে সিকিউআরএসের সুবিধাগুলি দেখতে আমার বেশ কষ্ট হচ্ছে। এখনও অবধি কেবলমাত্র দৃশ্যটি আমার কাছে সার্থক করে তোলে সিকিউআরএস + ইএস।
Snæbjørn

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

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

@ লেজারভ্যালমন্ট রিপোজিটরিটি কেবলমাত্র CRUD হওয়ার কথা be "প্রচুর CRUD অপারেশন নির্দিষ্ট করুন" কেবল 4 (বা "তালিকার সাথে 5) হওয়া উচিত। আপনার যদি আরও নির্দিষ্ট ক্যোয়ারী অ্যাক্সেসের ধরণ থাকে তবে সেগুলি আপনার সংগ্রহস্থল ইন্টারফেসে থাকা উচিত নয়। আমি কখনই অব্যবহৃত সংগ্রহস্থল পদ্ধতির সমস্যায় পড়িনি। আপনি কি একটি উদাহরণ দিতে পারেন?
স্যামুয়েল

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

10

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

লক্ষ্য করার মতো আর একটি বিষয় (আপনার ডিফল্টটির তুলনা দেওয়া হয়েছে) Login পদ্ধতির এবং পাতলা নিয়ন্ত্রকদের জন্য আকর্ষণের ): আমি হ'ল ডিফল্ট এএসপি.এনইটি টেম্পলেট / বয়লারপ্লেট কোডটি সর্বোত্তম অনুশীলনের জন্য উদ্বিগ্ন হওয়া উচিত as

আমি পাতলা নিয়ন্ত্রকগুলিও পছন্দ করি কারণ তারা পড়তে খুব সহজ। আমার প্রতিটি নিয়ামকের সাধারণত একটি "পরিষেবা" অবজেক্ট থাকে যা এটির সাথে যুক্ত হয় যা মূলত নিয়ামকের দ্বারা প্রয়োজনীয় যুক্তি পরিচালনা করে:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) {

    var result = _service.Login(model);
    switch (result) {
        case result.lockout: return View("Lockout");
        case result.ok: return RedirectToLocal(returnUrl);
        default: return View("GeneralError");
    }
}

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

মনে রাখবেন, এই সার্ভিস ক্লাসটি এখনও প্রয়োজনীয়ভাবে মডেল / অ্যাপ্লিকেশনটিতে যুক্তি সরবরাহ করার জন্য দায়বদ্ধ, কোডটি পরিষ্কার রাখার জন্য এটি নিয়ামকের সামান্যই বাড়ানো। পরিষেবা পদ্ধতি সাধারণত খুব ছোট।

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

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


5

আমি আপনাকে জিমি বোগার্ডের এনডিসি উপস্থাপনাটি দেখার অনুরোধ জানাই যাতে তার অনুরোধগুলির মডেলিংয়ের জন্য HTTP https://www.youtube.com/watch?v=SUiWfhAhgQw

তারপরে আপনি মেডিয়েটার কীসের জন্য ব্যবহার করা হয় তার একটি পরিষ্কার ধারণা পাবেন।

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

কিছুটা এইরকম:

public bool Execute<T>(Func<T> messageFunction)
{
    try
    {
        messageFunction();

        return true;
    }
    catch (ValidationException exception)
    {
        Errors = string.Join(Environment.NewLine, exception.Errors.Select(e => e.ErrorMessage));
        Logger.LogException(exception, "ValidationException caught in SiteController");
    }
    catch (SiteException exception)
    {
        Errors = exception.Message;
        Logger.LogException(exception);
    }
    catch (DbEntityValidationException dbEntityValidationException)
    {
        // Retrieve the error messages as a list of strings.
        var errorMessages = dbEntityValidationException.EntityValidationErrors
                .SelectMany(x => x.ValidationErrors)
                .Select(x => x.ErrorMessage);

        // Join the list to a single string.
        var fullErrorMessage = string.Join("; ", errorMessages);

        // Combine the original exception message with the new one.
        var exceptionMessage = string.Concat(dbEntityValidationException.Message, " The validation errors are: ", fullErrorMessage);

        Logger.LogError(exceptionMessage);

        // Throw a new DbEntityValidationException with the improved exception message.
        throw new DbEntityValidationException(exceptionMessage, dbEntityValidationException.EntityValidationErrors);                
    }
    catch (Exception exception)
    {
        Errors = "An error has occurred.";
        Logger.LogException(exception, "Exception caught in SiteController.");
    }

    // used to indicate that any transaction which may be in progress needs to be rolled back for this request.
    HttpContext.Items[UiConstants.Error] = true;

    Response.StatusCode = (int)HttpStatusCode.InternalServerError; // fail

    return false;
}

ব্যবহার কিছুটা এ জাতীয় দেখাচ্ছে:

[Route("api/licence")]
public IHttpActionResult Post(LicenceEditModel licenceEditModel)
{
    var updateLicenceCommand = new UpdateLicenceCommand { LicenceEditModel = licenceEditModel };
    int licenceId = -1;

    if (Execute(() => _mediator.Send(updateLicenceCommand)))
    {
        return JsonSuccess(licenceEditModel);
    }

    return JsonError(Errors);
}

আশা করি এইটি কাজ করবে.


4

অনেক লোক (আমি এটিও করেছিলাম) একটি লাইব্রেরির সাথে বিভ্রান্তি প্যাটার্ন। সিকিউআরএস হ'ল একটি প্যাটার্ন তবে মেডিটিআর একটি লাইব্রেরি যা আপনি সেই প্যাটার্নটি প্রয়োগ করতে ব্যবহার করতে পারেন

আপনি মেডিয়েটআর বা কোনও প্রক্রিয়াজাত বার্তা পাঠাগার ছাড়া সিকিউআরএস ব্যবহার করতে পারেন এবং আপনি সিকিউআরএস ছাড়াই মেডিয়েটআর ব্যবহার করতে পারেন:

public interface IProductsWriteService
{
    void CreateProduct(CreateProductCommand createProductCommand);
}

public interface IProductsReadService
{
    ProductDto QueryProduct(Guid guid);
}

সিকিউএস এর মত দেখতে হবে:

public interface IProductsService
{
    void CreateProduct(CreateProductCommand createProductCommand);
    ProductDto QueryProduct(Guid guid);
}

আসলে, আপনাকে উপরের মতো আপনার ইনপুট মডেলগুলির "কমান্ডগুলি" রাখতে হবে না CreateProductCommand। এবং আপনার প্রশ্নের ইনপুট "প্রশ্নগুলি"। কমান্ড এবং কোয়েরিগুলি হল মডেল নয়, পদ্ধতি not

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

Https://martinfowler.com/bliki/CQRS.html থেকে :

এর অন্তরে ধারণাটি হ'ল আপনি তথ্য পড়ার জন্য যে মডেলটি ব্যবহার করেন তার চেয়ে আলাদা আলাদা মডেল ব্যবহার করতে পারেন information

এটি যা বলে তাতে বিভ্রান্তি রয়েছে, এটি ইনপুট এবং আউটপুটটির জন্য আলাদা মডেল রাখার বিষয়ে নয়, এটি দায়িত্ব বিচ্ছিন্নকরণ সম্পর্কে।

সিকিউআরএস এবং আইডি উত্পাদনের সীমাবদ্ধতা

সিকিউআরএস বা সিকিউএস ব্যবহার করার সময় আপনার একটি সীমাবদ্ধতার মুখোমুখি হতে হবে

প্রযুক্তিগতভাবে আসল বিবরণীতে কমান্ডগুলির এমন কোনও মান (শূন্যতা) ফিরিয়ে দেওয়া উচিত নয় যা আমি নির্বোধ বলে মনে করি কারণ নতুনভাবে তৈরি করা বস্তু থেকে আইডি উত্পন্ন করার সহজ উপায় নেই: /programming/4361889/how-to- আইডি-ইন-তৈরি-যখন-প্রয়োগ-সেকার পাবেন

সুতরাং আপনাকে ডাটাবেসটি না করার পরিবর্তে প্রতিবার নিজেকে আইডি তৈরি করতে হবে।


আপনি যদি আরও জানতে চান: https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf


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

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

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