স্তরযুক্ত আর্কিটেকচারে বৈধকরণ এবং অনুমোদন


13

আমি জানি আপনি ভাবছেন (বা শুনে চিত্কার করছেন), "অন্য কোনও প্রশ্ন জিজ্ঞাসা করছে না যে স্তরযুক্ত আর্কিটেকচারের মধ্যে বৈধতা কোথায়?!?" আচ্ছা, হ্যাঁ, তবে আশা করি বিষয়টির বিষয়ে এটি একটু আলাদা হবে।

আমি দৃ firm় বিশ্বাসী যে বৈধতা অনেকগুলি রূপ নেয়, প্রসঙ্গ ভিত্তিক এবং স্থাপত্যের প্রতিটি স্তরে পরিবর্তিত হয়। এটি পোস্টের ভিত্তি - প্রতিটি স্তরে কী ধরণের বৈধতা কার্যকর করা উচিত তা সনাক্ত করতে সহায়তা করে। তদতিরিক্ত, একটি প্রশ্ন যা প্রায়শই আসে যা হ'ল অনুমোদনের চেকগুলি কোথায়।

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

public class CashDropApi  // This is in the Service Facade Layer
{
    [WebInvoke(Method = "POST")]
    public void AddCashDrop(NewCashDropContract contract)
    {
        // 1
        Service.AddCashDrop(contract.Amount, contract.DriverId);
    }
}

public class CashDropService  // This is the Application Service in the Domain Layer
{
    public void AddCashDrop(Decimal amount, Int32 driverId)
    {
        // 2
        CommandBus.Send(new AddCashDropCommand(amount, driverId));
    }
}

internal class AddCashDropCommand  // This is a command object in Domain Layer
{
    public AddCashDropCommand(Decimal amount, Int32 driverId)
    {
        // 3
        Amount = amount;
        DriverId = driverId;
    }

    public Decimal Amount { get; private set; }
    public Int32 DriverId { get; private set; }
}

internal class AddCashDropCommandHandler : IHandle<AddCashDropCommand>
{
    internal ICashDropFactory Factory { get; set; }       // Set by IoC container
    internal ICashDropRepository CashDrops { get; set; }  // Set by IoC container
    internal IEmployeeRepository Employees { get; set; }  // Set by IoC container

    public void Handle(AddCashDropCommand command)
    {
        // 4
        var driver = Employees.GetById(command.DriverId);
        // 5
        var authorizedBy = CurrentUser as Employee;
        // 6
        var cashDrop = Factory.CreateCashDrop(command.Amount, driver, authorizedBy);
        // 7
        CashDrops.Add(cashDrop);
    }
}

public class CashDropFactory
{
    public CashDrop CreateCashDrop(Decimal amount, Employee driver, Employee authorizedBy)
    {
        // 8
        return new CashDrop(amount, driver, authorizedBy, DateTime.Now);
    }
}

public class CashDrop  // The domain object (entity)
{
    public CashDrop(Decimal amount, Employee driver, Employee authorizedBy, DateTime at)
    {
        // 9
        ...
    }
}

public class CashDropRepository // The implementation is in the Data Access Layer
{
    public void Add(CashDrop item)
    {
        // 10
        ...
    }
}

আমি 10 টি অবস্থান নির্দেশ করেছি যেখানে আমি কোডে বৈধতা যাচাই করা পরীক্ষা দেখেছি। আমার প্রশ্নটি হ'ল নীচের ব্যবসায়ের প্রতিটি বিধি (দৈর্ঘ্য, ব্যাপ্তি, ফর্ম্যাট, প্রকারের জন্য স্ট্যান্ডার্ড চেক সহ) আপনি কী চেকগুলি প্রদর্শন করছেন:

  1. নগদ ড্রপের পরিমাণ অবশ্যই শূন্যের চেয়ে বেশি হতে হবে।
  2. নগদ ড্রপের একটি বৈধ ড্রাইভার থাকতে হবে।
  3. বর্তমান ব্যবহারকারীর নগদ ড্রপ যোগ করার জন্য অনুমোদিত হতে হবে (বর্তমান ব্যবহারকারী ড্রাইভার নয়)।

আপনার কীভাবে বা এই দৃশ্যের কাছে এবং কীভাবে আপনার পছন্দগুলির কারণগুলি রয়েছে সে সম্পর্কে আপনার চিন্তাভাবনাগুলি ভাগ করুন।


এসই "তাত্ত্বিক এবং বিষয়গত আলোচনাকে উত্সাহিত করার জন্য সঠিক প্ল্যাটফর্ম নয়"। ভোট বন্ধ
tmadmers

দুর্বল শব্দযুক্ত বক্তব্য। আমি সত্যিই সেরা অনুশীলন খুঁজছি।
SonOfPirate

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

@ ফাস্তাই: এটি এত বেশি 'বিষয়গত' অংশ নয়, বরং 'আলোচনা' যা আমাকে বিরক্ত করে।
টিডামার্স

আমি মনে করি আপনি এখানে CashDropAmountব্যবহার করার পরিবর্তে একটি মান অবজেক্ট রেখে মান অবজেক্টগুলি লাভ করতে পারেন Decimal। কমান্ড হ্যান্ডলারে ড্রাইভার উপস্থিত রয়েছে কি নেই তা যাচাই করা এবং এটি অনুমোদনের নিয়মের ক্ষেত্রেও একই কাজ। Approver approver = approverService.findById(employeeId)কর্মী অনুমোদকের ভূমিকায় না থাকলে এমন কিছু করার মাধ্যমে আপনি বিনা মূল্যে অনুমোদন পেতে পারেন। Approverশুধু একটি মান বস্তু হবে, একটি সত্তা নয়। এছাড়াও আপনি পরিবর্তে একটি শিরোণামে আপনার কারখানা বা ব্যবহারের কারখানা পদ্ধতি পরিত্রাণ পেতে পারে: cashDrop = driver.dropCash(...)
প্ল্লেক্স

উত্তর:


2

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

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

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

সংগ্রহস্থলটি কেবলমাত্র যাচাই করা উচিত যে অবজেক্টে থাকা ডেটা আপনার ডাটাবেসে সংজ্ঞায়িত স্কিমার সাথে সামঞ্জস্যপূর্ণ এবং ডিএ অপারেশন সফল হবে। উদাহরণস্বরূপ, আপনার যদি একটি কলাম থাকে যা শূন্য হতে পারে না বা তার সর্বোচ্চ দৈর্ঘ্য ইত্যাদি রয়েছে,

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


1

আপনার প্রথম ব্যবসায়ের নিয়ম

নগদ ড্রপের পরিমাণ অবশ্যই শূন্যের চেয়ে বেশি হতে হবে।

আপনার CashDropসত্তা এবং আপনার AddCashDropCommandশ্রেণীর এক অদম্য দেখাচ্ছে looks বেশ কয়েকটি উপায় রয়েছে যে আমি এইরকম একজন আক্রমণকারীকে প্রয়োগ করি:

  1. চুক্তির পথে ডিজাইন নিন এবং আপনার কেসের উপর নির্ভর করে পূর্ব শর্তাদি, পোস্টকন্ডিশনস এবং একটি [কন্ট্রাক্ট ইন্ভেয়ারিয়েন্টমেথ] এর সংমিশ্রণ সহ কোড চুক্তি ব্যবহার করুন।
  2. আপনি যদি 0 এর চেয়ে কম পরিমাণে পাস করেন তবে কনস্ট্রাক্টর / সেটারগুলিতে স্পষ্ট কোড লিখুন যা একটি আর্গুমেন্টএক্সসেপশন ছুড়ে দেয়।

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

এর মধ্যে যে কোনও ক্ষেত্রে আপনাকে আপনার ডোমেন মডেলটি নেভিগেট করতে হবে এবং আপনার কোড উদাহরণে যেমন করছেন তেমন Driverউদাহরণটি আপনার কাছ থেকে পাওয়া IEmployeeRepositoryদরকার location 4। সুতরাং, এখানে আপনাকে নিশ্চিত করতে হবে যে সংগ্রহস্থলের কলটি ফিরবে না, সেই ক্ষেত্রে আপনার ড্রাইভারআইডি বৈধ ছিল না এবং আপনি আর প্রসেসিংয়ের সাথে এগিয়ে যেতে পারবেন না।

অন্য 2 টি (আমার অনুমানমূলক) চেকগুলির জন্য (ড্রাইভারের বৈধ ড্রাইভিং লাইসেন্স রয়েছে কি, আজ সেই ড্রাইভারটি কাজ করছিল) আপনি ব্যবসার বিধিগুলি কার্যকর করছেন।

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

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

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

আপনার ক্ষেত্রে আপনি কলটি বাধা দিতে পারেন

CashDropService.AddCashDrop(...) 

AddCashDropCommandHandler.Handle(...)

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

আশা করি এটি আপনাকে কিছু ধারণা দেয়।


আপনি কীভাবে ব্যাখ্যা করতে পারবেন যে আমি "আপনার আইওসি ধারকটি যেখানে এই অনুমোদনের আচরণটি করা দরকার সেখানে ইনজেক্ট করতে ব্যবহার করব"? এটি আবেদনময়ী মনে হয় তবে এওপি এবং আইওসি একসাথে কাজ করা আমার পক্ষে এতদূর এড়িয়ে যায়।
SonOfPirate

বাকী হিসাবে, আমি অবজেক্টটিকে একটি অবৈধ অবস্থায় প্রবেশ করতে বাধা দেওয়ার জন্য কনস্ট্রাক্টর এবং / অথবা সেটারগুলিতে বৈধতা দেওয়ার সাথে একমত হয়েছি (আক্রমণকারীদের পরিচালনা করা)। তবে এর বাইরে এবং ড্রাইভারটি সনাক্ত করতে আইম্পপ্লয়ি রিপোসিটরিতে যাওয়ার পরে নাল চেকের একটি রেফারেন্স, আপনি বাকি বৈধতাটি কোথায় সম্পাদন করবেন সে সম্পর্কে কোনও বিবরণ সরবরাহ করবেন না। ফ্লুয়েন্টভ্ল্যাডিকেশন এবং এটির পুনঃব্যবহার ইত্যাদির ব্যবহার দেওয়া, আপনি প্রদত্ত মডেলটিতে নিয়মগুলি কোথায় প্রয়োগ করবেন?
SonOfPirate

আমি আমার উত্তরটি সম্পাদনা করেছি - দেখুন এটি সাহায্য করে কিনা। তবে "প্রদত্ত মডেলটিতে আপনি কোথায় বিধি প্রয়োগ করবেন?"; আপনার কমান্ড হ্যান্ডলারে সম্ভবত 4, 5, 6, 7 এর কাছাকাছি। আপনার কাছে এমন ভাণ্ডারগুলিতে অ্যাক্সেস রয়েছে যা আপনার ব্যবসায়ের স্তরের বৈধতা সম্পাদনের জন্য প্রয়োজনীয় তথ্য দিতে পারে can তবে আমি মনে করি এমন আরও অনেকে আছেন যারা এখানে আমার সাথে দ্বিমত পোষণ করবেন।
রবার্টএমএস

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

1

নিয়মের জন্য:

1- নগদ ড্রপের পরিমাণ অবশ্যই শূন্যের চেয়ে বেশি হতে হবে।

2- নগদ ড্রপের একটি বৈধ ড্রাইভার থাকতে হবে।

3- বর্তমান ব্যবহারকারীর নগদ ড্রপ যোগ করার জন্য অনুমোদিত হতে হবে (বর্তমান ব্যবহারকারী ড্রাইভার নয়)।

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

নিয়ম (2) এবং (3) এর জন্য, এটি অবশ্যই ডাটাবেস অ্যাক্সেস লেয়ারে (বা ডিবি স্তর নিজেই) করতে হবে কারণ এতে ডিবি অ্যাক্সেস জড়িত। ইচ্ছাকৃতভাবে স্তরগুলির মধ্যে ভ্রমণ করার দরকার নেই।

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

ভাল প্রশ্ন!


অনুমোদনের জন্য +1 - এটি ইউআইতে রাখা এমন একটি বিকল্প যা আমি আমার উত্তরে উল্লেখ করি নি।
রবার্টএমএস

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

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