অটোম্যাপার বনাম ভ্যালুআইঞ্জেক্টর [বন্ধ]


209

আমি যখনই স্ট্যাকওভারফ্লোতে অটোম্যাপার স্টাফ সন্ধান করছি, আমি ভ্যালুইঞ্জেক্টর সম্পর্কে কিছু পড়ছি

কেউ কি আমাকে তাদের মধ্যকার উপকারিতা এবং কার্যকারিতা বলতে পারেন (পারফরম্যান্স, ফিচারস, এপিআই ব্যবহার, এক্সটেনসিবিলিটি, টেস্টিং)?



1
আঠার কী? glue.codeplex.com দেখতে দুর্দান্ত একটি প্রকল্পের মতো দেখায়, তবে আমি এখনও এটি চেষ্টা করি নি। যদিও আমি পরের মাসে চলবো। আমিও একটি প্রকল্প EmitMapper নামক দেখা করেছি emitmapper.codeplex.com
Trygve

এই দুটি সরঞ্জাম সম্পর্কে কথা বলার একটি নিবন্ধ দেখুন - devproconnections.com/de વિકાસment/…
জর্জ বীরবিলিস

উত্তর:


170

ValueInjecter এর স্রষ্টা হিসাবে , আমি আপনাকে বলতে পারি যে আমি এটি করেছি কারণ আমি কিছু সহজ এবং খুব নমনীয় পেতে চেয়েছিলাম

আমি সত্যিই বেশি লেখা বা প্রচুর লাইক লেখা পছন্দ করি না monkey code:

Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.

ভ্যালুআইঞ্জেক্টর এটির প্লাগইনগুলির সাথে মজিলার মতো কিছু , আপনি ভ্যালুআইঞ্জেকশন তৈরি করে সেগুলি ব্যবহার করেন

চ্যাপ্টা, অপরিবর্তনীয় এবং কিছু উত্তরাধিকার সূত্রে তৈরির জন্য অন্তর্নির্মিত ইনজেকশন রয়েছে

এবং এটি একটি দিক ধরণের আরও কাজ করে , আপনাকে সমস্ত বৈশিষ্ট্য 1-থেকে -1 নির্দিষ্ট করতে হবে না, পরিবর্তে আপনি এমন কিছু করতে হবে:

উত্স থেকে সমস্ত ইন্টিরিটি বৈশিষ্ট্য গ্রহণ করুন যার নামটি "আইডি" দিয়ে শেষ হয়, মানটি রূপান্তর করুন এবং প্রত্যেকে আইড প্রত্যয় ছাড়াই একই নামের সাথে উত্স অবজেক্টের একটি সম্পত্তিতে সেট করুন এবং এটি টাইপটি সত্তা থেকে উত্তরাধিকার সূত্রে প্রাপ্ত

সুতরাং একটি স্পষ্ট পার্থক্য, ValueInjecter এমনকি সমতল এবং অপরিবর্তনীয় উইন্ডোজ আকারে ব্যবহৃত হয়, এটি কতটা নমনীয়

(অবজেক্ট থেকে ফর্ম নিয়ন্ত্রণ এবং পিছনে ম্যাপিং)

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

foos.Select(o => new Bar().InjectFrom(o));

আপনি বেনামি এবং গতিশীল অবজেক্ট থেকে মানচিত্র করতে ValueInjecter ব্যবহার করতে পারেন

পার্থক্য:

  • প্রতিটি মানচিত্রের সম্ভাবনার জন্য অটোমেপার কনফিগারেশন তৈরি করুন ক্রিয়েটম্যাপ ()

  • যেকোন অবজেক্ট থেকে যেকোন অবজেক্টে ভ্যালেনিনজেক্টর ইনজেকশন (এমন কোনও ঘটনাও ঘটে যখন আপনি অবজেক্ট থেকে ভ্যালুয়েটাইপ ইনজেক্ট করেন)

  • অটোম্যাপারটি এটিকে চ্যাপ্টা করে তৈরি করেছে এবং এটি কেবল সহজ প্রকারের জন্য বা একই ধরণের, এবং এতে অবিচ্ছিন্নতা নেই

  • যদি আপনার এটির প্রয়োজন হয় তবেই মানটিজেক্টর target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection> এবং যদি আপনার কাছে থেকে Foo.Bar.Name of type Stringআপনি FooBarName of type Class1ফ্ল্যাটলুপভ্যালুআইজেনশন উত্তরাধিকার সূত্রে পান এবং এটি নির্দিষ্ট করুন

  • ডিফল্টরূপে অটোম্যাপার একই বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যগুলির মানচিত্রগুলি এবং বাকীগুলির জন্য আপনাকে একে একে নির্দিষ্ট করতে হবে এবং প্রোপ 1 এর মতো স্টাফ করতে হবে I

  • valueinjecter এর একটি ডিফল্ট ইনজেকশন রয়েছে nInjectFrom () যা একই নাম এবং প্রকারের সাথে বৈশিষ্ট্যগুলি দেয়; অন্য সমস্ত কিছুর জন্য আপনি স্বতন্ত্র ম্যাপিং যুক্তি / নিয়মগুলির সাথে আপনার কাস্টম মান সংযোগ তৈরি করেন, আরও দিকগুলির মতো, যেমন টাইপ ফু এর সমস্ত প্রপস থেকে শুরু করে টাইপ বারের সমস্ত প্রপস পর্যন্ত


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

3
@ ক্রিস মেরিসিক আপনি এটি ব্যবহার করতে পারেন, আপনি যদি গভীর ক্লোনিং বোঝাতে চান তবে আমি একবারে একটি ইনজেকশন দিয়েছিলাম যে একবার এই ধরনের পুনরাবৃত্তি করে তবে সংগ্রহের বৈশিষ্ট্যের জন্য কাজ করে না ভ্যালিনিনজেকটার.কোড্লেক্স / থ্রেড / ভিউ.এএসপিএক্স? থ্রেডআইডি=236126 , বা আপনি একটি ফ্ল্যাট ভিউমোডেল করতে পারেন এবং চ্যাপ্টা এবং অপরিবর্তনীয় ব্যবহার করতে পারেন, এটি সহজ হবে
ওমু

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

27
<pedant>দেখতে দুর্দান্ত লাগছে, তবে সম্ভবত এটি ValueInjectOr হওয়া উচিত? </pedant>
ক্রেগ স্টান্টজ

1
কিন্তু কোনো কারণে এটা Er এর :)
Omu

59

যেহেতু আমি অন্য কোনও সরঞ্জাম ব্যবহার করি নি, আমি কেবল অটোম্যাপার সম্পর্কেই কথা বলতে পারি। অটোম্যাপার তৈরির জন্য আমার কয়েকটি লক্ষ্য ছিল:

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

আপনি যদি এই জিনিসগুলি করতে চান তবে অটোম্যাপার আপনার জন্য খুব ভাল কাজ করে। অটোম্যাপার যে জিনিসগুলি ভাল করে না সেগুলি হ'ল:

  • বিদ্যমান বস্তুগুলি পূরণ করা
  • Unflattening

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


1
@ জিমি বোগার্ড আপনি কি দেখতে পাচ্ছেন যে বিদ্যমান বস্তুগুলি পূরণ করা কখনই অটোম্যাপারের বৈশিষ্ট্য তালিকায় এটি তৈরি করতে পারে?
রোমান

আমি ভ্যালুআইঞ্জেক্টর চেষ্টা করে দেখিনি, তবে আমাদের যা প্রয়োজন, তার জন্য অটোম্যাপার খুব শক্তিশালী।
richb01

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

55

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

myObject.InjectFrom(otherObject);

আমার ইনজেকশন প্রয়োজনের বিশাল সংখ্যাগরিষ্ঠতার জন্য এটিই জানা দরকার। এটি সম্ভবত এর চেয়ে সহজ এবং মার্জিত হতে পারে না।


1
this objectসেখানে এক্সটেনশন পদ্ধতি?
ক্রিস মেরিসিক

2
আমি কীভাবে ভ্যালুইঞ্জেক্টর থেকে আমার কোডটি ডিকুয়াল করতে পারি? আমার কাছে মনে হয় এটি সর্বদা আমার ওয়েব প্রকল্পে ValueInjecter এর অবসন্নতা বলে মনে হয়, কারণ আমি প্রদত্ত বস্তুটি DIRECTLY এ ValueInjecter (এক্সটেনশন পদ্ধতি) ব্যবহার করি।
রোকিয়ান

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

13
কেন একটি মোড়ক সেরা সমাধান? আপনি ম্যাপারটি স্যুইচ করতে চান তবে আপনাকে কেবলমাত্র InjectFrom()এক্সটেনশন পদ্ধতিটি নিজেরাই প্রয়োগ করতে হবে ।
jgauffin

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

27

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

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

সত্তা ফ্রেমওয়ার্ক দ্বারা তৈরি মডেল (প্রথম মডেল):

public partial class Family
{ 
    public int Id { get; set; }
    public string FamilyName { get; set; }

    public virtual Address Address { get; set; }
}

public partial class Address
{
    public int Id { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string TownCity { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }

    public virtual Family Family { get; set; }
}

ভিউমোডেল (যা আমি ভ্যালিডেটরগুলির সাথে সজ্জিত করতে পারি):

public class FamilyViewModel
{
    public int Id { get; set; }
    public string FamilyName { get; set; }

    public int AddressId { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressTownCity { get; set; }
    public string AddressCounty { get; set; }
    public string AddressPostcode { get; set; }
}

ভিউকন্ট্রোলার:

    //
    // GET: /Family/Create

    public ActionResult Create()
    {
        return View();
    } 

    //
    // POST: /Family/Create

    [HttpPost]
    public ActionResult Create(FamilyViewModel familyViewModel)
    {
        try
        {
            Family family = new Family();
            family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
            db.Families.Add(family);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

আমার মনে, এটি এর চেয়ে সহজ সরল হয় না?

(সুতরাং এই প্রশ্নটি উত্থাপন করে, আমি যে ধাঁচে এটি চালাচ্ছি তাতে কী ভুল হয়েছে (এবং এটি অন্য অনেকের মনে হয়), এটি অটোম্যাপারের কাছে মূল্য হিসাবে দেখা যায় না?)

তবে, যদি এই প্যাটার্নটি বাতিল হয়ে যায়, আপনি যদি এটি ব্যবহার করতে চান তবে আমার ভোটটি একটি দেশের মাইল অনুসারে ভ্যালিনইঞ্জেক্টর।


1
সম্ভবত আপনারও এএসপিএন-এমভিসি এবং সেরা-অনুশীলনগুলি, ভিউমডেল ..., এটিএম সহ একটি পৃথক প্রশ্নে জিজ্ঞাসা করা উচিত, যতক্ষণ না এটি আপনার পক্ষে ভাল কাজ করে ততক্ষণ আমি কোনও সমস্যা দেখি না, তবে আমি নিশ্চিত যে কারওর বিভিন্ন মতামত থাকতে পারে
ওমু

ভাল এমভিসি শিখেছি। আমি এখন আমার প্রশ্নের উত্তর দিতে পারি। আপনি যখন জনবহুল ভিউ মডেলটি ফিরে পাবেন তখন মূল মডেলটি আপডেট করার উপায়টি হল আপডেটমোডেল () ফাংশন এমভিসি সরবরাহ করে।
ড্যানএইচ

1
আপডেটমোডেল () দৃশ্যটি উপস্থাপন করে এমন মডেলটি তৈরি করতে ব্যবহৃত হয় এবং এটি অ্যাকশন (মাইমোডেলক্লাস মডেল) করার মতো
ওমু

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

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