বিভিন্ন সমাবেশে দুটি আংশিক ক্লাস একই শ্রেণীর প্রতিনিধিত্ব করা কি সম্ভব?


128

আমার কাছে 'মাইপ্রজেক্ট.ডাটা' নামে একটি প্রকল্পে 'আর্টিকেল' নামে একটি ক্লাস রয়েছে, যা আমার ওয়েব অ্যাপ্লিকেশনটির ডেটা স্তর হিসাবে কাজ করে।

আমার কাছে 'মাইপ্রজেক্ট.এডমিন' নামে একটি পৃথক প্রকল্প রয়েছে, যা ডেটা দেখার / সম্পাদনার জন্য একটি ওয়েব-ভিত্তিক অ্যাডমিন সিস্টেম এবং এএসপি.নেট ডায়নামিক ডেটা ব্যবহার করে নির্মিত হয়েছিল।

মূলত আমি আংশিক শ্রেণি ব্যবহার করে আর্টিক্যাল ক্লাসটি প্রসারিত করতে চাই, যাতে আমি এর একটি বৈশিষ্ট্য "ইউআইইচিন্ট" এক্সটেন্ডারের সাথে বাড়িয়ে তুলতে পারি, যা আমাকে এফসিকেইডিট নিয়ন্ত্রণের সাথে সাধারণ মাল্টি-লাইন পাঠ্যবক্সকে প্রতিস্থাপন করতে দেয়।

আমার আংশিক শ্রেণি এবং বর্ধক এর মত দেখতে লাগবে:

[MetadataType(typeof(ProjectMetaData))]
public partial class Project
{
}

public class ProjectMetaData
{
    [UIHint("FCKeditor")]
    public object ItemDetails { get; set; }
}

আংশিক শ্রেণি যদি মূল আংশিক শ্রেণীর - যেমন মাইপ্রজেক্ট.ডাটা প্রকল্প হিসাবে একই প্রকল্পে থাকে তবে এখন এটি সমস্ত কার্যকর হয়।

তবে ইউআই আচরণটি ডেটা স্তরে বসে না থেকে বরং অ্যাডমিন স্তরে বসে থাকা উচিত। সুতরাং আমি এই শ্রেণিটি মাইপ্রজেক্ট.এডমিনে স্থানান্তর করতে চাই।

তবে, আমি যদি এটি করি তবে কার্যকারিতাটি নষ্ট হয়ে যায়।

আমার মৌলিক প্রশ্নটি: আমার কি পৃথক প্রকল্পে 2 টি আংশিক ক্লাস থাকতে পারে, তবে উভয়ই একই "শ্রেণি" উল্লেখ করছেন?

যদি তা না হয়, তবে ইউআই যুক্তির সাথে ডেটা-স্তর যুক্তিকে মিশ্রিত না করে আমি যা করার চেষ্টা করছি তা সম্পাদনের কোনও উপায় আছে?


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

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

প্রতিক্রিয়া জানাতে খুব দেরি হয়ে গেছে, তবে আমি এখানে
উসমান

আমি প্রতিক্রিয়া জানাতে খুব দেরী জানি, তবে এখানে আমি একটি সমাধান উপস্থাপন করেছি।
উসমান

উত্তর:


178

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


15

যেমনটি উল্লেখ করা হয়েছে, আংশিক ক্লাসগুলি একটি সংকলন-কালীন ঘটনা, রানটাইম নয়। সমাবেশগুলিতে ক্লাসগুলি সংজ্ঞা অনুসারে সম্পূর্ণ হয়।

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

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


8

প্রসারিত পদ্ধতিতে এবং ভিউমোডেলগুলি হ'ল প্রান্তে ডেটা-স্তর অবজেক্টগুলিকে প্রসারিত করার মানক উপায়:

ডেটা স্তর (শ্রেণিবদ্ধ গ্রন্থাগার, পার্সোন.সি):

namespace MyProject.Data.BusinessObjects
{
  public class Person
  {
    public string Name {get; set;}
    public string Surname {get; set;}
    public string Details {get; set;}
  }
}

ডিসপ্লে লেয়ার (ওয়েব অ্যাপ্লিকেশন) পার্সোন এক্সটেনশন সি:

using Data.BusinessObjects
namespace MyProject.Admin.Extensions
{
  public static class PersonExtensions
  {
    public static HtmlString GetFormattedName(this Person person)
    {
       return new HtmlString(person.Name + " <b>" + person.Surname</b>);
    }
  }
}

ভিউমোডেল (বর্ধিত দর্শন-নির্দিষ্ট ডেটার জন্য):

using Data.BusinessObjects
namespace MyProject.Admin.ViewModels
{
  public static class PersonViewModel
  {
    public Person Data {get; set;}
    public Dictionary<string,string> MetaData {get; set;}

    [UIHint("FCKeditor")]
    public object PersonDetails { get { return Data.Details; } set {Data.Details = value;} }
  }
}

নিয়ামক ব্যক্তি নিয়ন্ত্রণকারী:

public ActionMethod Person(int id)
{
  var model = new PersonViewModel();
  model.Data = MyDataProvider.GetPersonById(id);
  model.MetaData = MyDataProvider.GetPersonMetaData(id);

  return View(model);
}

দেখুন, পার্সোন সিএসটিএমএল:

@using MyProject.Admin.Extensions

<h1>@Model.Data.GetFormattedName()</h1>
<img src="~/Images/People/image_@(Model.MetaData["image"]).png" >
<ul>
  <li>@Model.MetaData["comments"]</li>
  <li>@Model.MetaData["employer_comments"]</li>
</ul>
@Html.EditorFor(m => m.PersonDetails)

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

2

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


1

আমি এই একই সমস্যা ছিল। আমি আমার ডেটা প্রকল্পে আমার আংশিক ক্লাস রেখেছি যাতে আপনার ক্ষেত্রে 'মাইপ্রজেক্ট.ডাটা'। মেটাডাটা ক্লাসগুলি আপনার প্রশাসনিক প্রকল্পে যাওয়া উচিত নয় কারণ আপনি অন্যান্য বিজ্ঞানের মতো একটি বিজ্ঞপ্তি উল্লেখ তৈরি করবেন।

আমি আমার মেটাডেটা ক্লাসের জন্য একটি নতুন ক্লাস লিবি প্রকল্প যুক্ত করেছি যেমন 'মাইপ্রজেক্ট.মেটাডাটা' এবং তারপরে এটি আমার ডেটা প্রকল্প থেকে রেফারেন্স করেছি


1

সম্ভবত একটি স্ট্যাটিক এক্সটেনশন ক্লাস ব্যবহার করুন।


ভাল ধারণা. আপনি নিজের উত্তরের মধ্যে যথেষ্ট কার্যকারিতা সরবরাহ করবেন বলে কি মনে করেন তার একটি উদাহরণ সরবরাহ করতে পারেন?
মিনিটে প্যানহাউটেন

0

আমার এখানে ভুল হতে পারে, তবে আপনি কি নিজের মাইপ্রজেক্ট.এডমিন প্রকল্পে প্রজেক্টমেটাডাটা ক্লাসটি সংজ্ঞায়িত করতে পারবেন না?


0

আপনার নতুন প্রকল্পে কেবল ক্লাস ফাইলটিকে লিঙ্ক হিসাবে যুক্ত করুন এবং আপনার আংশিক শ্রেণিতে একই নাম স্থানটি রাখুন।


0

2019 সাল থেকে আপনি একটি কৌশল ব্যবহার করে বিভিন্ন সমাবেশে আংশিক শ্রেণির 2 অংশ রাখতে পারেন। এই কৌশলটি এই নিবন্ধে ব্যাখ্যা এবং প্রদর্শিত হয়েছে:

https://www.notion.so/vapolia/Secret-feature-Xamarin-Forms-control-s-auto-registration-1fd6f1b0d98d4aabb2defa0eb14961fa

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

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