আমি ইদানীং সিকিউআরএস / মেডিয়েটআর সন্ধান করছি। তবে আমি যতটা পছন্দ করি তত কম ড্রিল করি। সম্ভবত আমি কিছু / সবকিছু ভুল বুঝেছি।
সুতরাং এটিতে আপনার নিয়ামককে হ্রাস করার দাবি করে দারুণ শুরু হয়
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
তবে এটি একটি খুব জড়িত প্রক্রিয়া হবে।
সুতরাং সর্বোপরি আমার এই "সাধারণ" ক্রিয়াটি রূপান্তর করতে খুব কষ্ট হচ্ছে।
আমি ইনপুট খুঁজছি আমি কি এখানে পুরোপুরি ভুল করছি?