আইভিডিয়েটেবলঅবজেক্ট বনাম একক দায়িত্ব


12

আমি এমভিসির এক্সনেসিবিলিটি পয়েন্টটি পছন্দ করি, ভিউ মডেলগুলিকে আইভিডিয়েটেটেবলঅবজেক্ট বাস্তবায়ন করতে এবং কাস্টম বৈধতা যুক্ত করতে দেয়।

এই কোডটি কেবলমাত্র বৈধতা যুক্তিযুক্ত হওয়ার কারণে আমি আমার কন্ট্রোলারদেরকে ঝুঁকে রাখার চেষ্টা করি:

if (!ModelState.IsValid)
    return View(loginViewModel);

উদাহরণস্বরূপ, একটি লগইন ভিউ মডেল আইভিলেডিয়েটেবল ওজেক্ট প্রয়োগ করে, কনস্ট্রাক্টর ইনজেকশনের মাধ্যমে আইলোগিনভালিডেটর বস্তুটি পান:

public interface ILoginValidator
{
    bool UserExists(string email);
    bool IsLoginValid(string userName, string password);
}

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

এই একটি ভাল পন্থা? এর চেয়ে ভাল আর কি আছে?


যদি আপনি কোনও পৃথক বস্তুতে বৈধতা চান তবে ফ্লুয়েন্টভালিডেশন চেষ্টা করুন। ফ্লুয়েন্টিওয়েলেশন.কোড্লেক্স / উইকিপেজ ? title=mvc দেখুন ।
rmac

+1 একটি পৃথক ভ্যালিডেটার শ্রেণিতে ইনজেকশন করার জন্য দুর্দান্ত ধারণা, এটি আমার সমস্যার সমাধান করে যেখানে আমাকে বৈধতার জন্য ডেটাবেস তথ্য অ্যাক্সেস করতে হবে!
চৌম্বকীয়

উত্তর:


7

ব্যক্তিগতভাবে, আমার কাছে আপনার নকশা পরিষ্কার মনে হয়েছে।

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


4

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

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


3

আপনার ভিএম কনস্ট্রাক্টরে আইলোগিনভালিডেটর ইনজেক্ট করার পরিবর্তে আপনি ভ্যালিডেশনারটি পেতে ভ্যালিডেশনকন্টেক্সট (যা আইভিডিয়েটেবলঅবজেক্ট.ভালিডেট ()) ব্যবহার করতে পারেন Val

public IEnumerable<ValidationResult> Validate(ValidationContext vc)
{

var loginValidator = (ILoginValidator)vc.GetService(typeof(ILoginValidator));
return loginValidator.Validate();

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