क्या अलग-अलग विधानसभाओं में दो आंशिक वर्गों का एक ही वर्ग का प्रतिनिधित्व करना संभव है?


128

मेरे पास 'MyProject.Data' नामक एक परियोजना में 'अनुच्छेद' नामक एक वर्ग है, जो मेरे वेब एप्लिकेशन के लिए डेटा लेयर के रूप में कार्य करता है।

मेरे पास 'MyProject.Admin' नामक एक अलग परियोजना है, जो डेटा को देखने / संपादित करने के लिए एक वेब-आधारित व्यवस्थापक प्रणाली है, और ASP.NET डायनेमिक डेटा का उपयोग करके बनाया गया था।

मूल रूप से मैं एक आंशिक वर्ग का उपयोग करके अनुच्छेद वर्ग का विस्तार करना चाहता हूं, ताकि मैं इसके गुणों में से एक "UIHint" एक्सटेंडर के साथ बढ़ा सकूं, जो मुझे सामान्य बहु-पंक्ति टेक्स्टबॉक्स को FCKEdit नियंत्रण के साथ बदलने की अनुमति देगा।

मेरा आंशिक वर्ग और विस्तारक इस तरह दिखेगा:

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

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

अब यह सब ठीक काम करता है यदि आंशिक वर्ग मूल आंशिक वर्ग - यानी MyProject.Data परियोजना के समान परियोजना में है।

लेकिन UI व्यवहार को डेटा लेयर में नहीं बैठना चाहिए, बल्कि एडमिन लेयर में होना चाहिए। इसलिए मैं इस कक्षा को MyProject.Admin में स्थानांतरित करना चाहता हूं।

हालांकि, अगर मैं ऐसा करता हूं, तो कार्यक्षमता खो जाती है।

मेरा मौलिक प्रश्न है: क्या मेरे पास अलग-अलग परियोजनाओं में 2 आंशिक वर्ग हो सकते हैं, लेकिन दोनों एक ही "वर्ग" का संदर्भ देते हैं?

यदि नहीं, तो क्या यूआई लॉजिक के साथ डेटा-लेयर लॉजिक को मिलाए बिना मैं जो करने की कोशिश कर रहा हूं, उसे पूरा करने का एक तरीका है?


1
यही कारण है कि मेटाडेटा टाइप की अवधारणा बदबू आ रही है। ( en.wikipedia.org/wiki/Code_smell )। यह पूरी तरह से दोषपूर्ण समाधान है - आप एमवीसी बनाने की कोशिश कर रहे हैं जो विशेष रूप से नियंत्रक से मॉडल को अलग करता है और आपको डेटा वर्गों में दृश्य और सत्यापन तर्क की आवश्यकता है। हास्यास्पद। इन विशेषताओं को लागू करने का एक बेहतर तरीका होना चाहिए। आपको एक धाराप्रवाह एपीआई या कुछ इसी तरह का उपयोग करके डेटा वर्ग के साथ मेटाडेटा वर्ग को जोड़ने में सक्षम होना चाहिए। इसे बेक नहीं किया जाना चाहिए।
जिम

कुछ अन्य उत्तर इसका उल्लेख करते हैं: यदि यह एक पूर्ण होना चाहिए, और आप संदर्भित विधानसभा स्रोत के मालिक हैं, तो आप हमेशा स्रोत मॉडल को लिंक की गई फ़ाइलों (ऐड-मौजूदा-आइटम फ़ाइल पिकर पर विभाजन-बटन) के रूप में शामिल कर सकते हैं ताकि वे इसके साथ निर्मित हों विधानसभा रेफरी के बजाय खपत। (सेवा संदर्भ के साथ WCF के माध्यम से अपने मॉडल / डेटा लेयर को उजागर करने के लिए इसी तरह की रणनीति और उन आंशिक कोड-जीन'ड क्लासेस का विस्तार करना।) आपको कभी भी परतों को नष्ट करने के लिए मजबूर नहीं किया जाता है - आप हमेशा उपवर्ग कर सकते हैं। और MetadataTypeमॉडल को ViewModels की तरह बनाता है।
जोब्राहॉस

इसका जवाब देने में बहुत देर हो गई, लेकिन मैंने यहां
उस्मान

मैं इसका जवाब देना बहुत देर से जानता हूं, लेकिन यहां मैंने एक समाधान प्रस्तुत किया है।
उस्मान

जवाबों:


178

नहीं, आपके पास दो अलग-अलग विधानसभाओं (परियोजनाओं) में एक ही कक्षा का संदर्भ देने वाली दो आंशिक कक्षाएं नहीं हो सकती हैं। एक बार विधानसभा संकलित हो जाने के बाद, मेटा-डेटा को बेक किया जाता है और आपकी कक्षाएं अब आंशिक नहीं होती हैं। आंशिक कक्षाएं आपको एक ही वर्ग की परिभाषा को दो फाइलों में विभाजित करने की अनुमति देती हैं।


15

जैसा कि उल्लेख किया गया है, आंशिक कक्षाएं एक संकलन-समय की घटना है, न कि रनटाइम। विधानसभाओं में कक्षाएं परिभाषा के अनुसार पूरी होती हैं।

MVC के संदर्भ में, आप कोड को मॉडल कोड से अलग रखना चाहते हैं, फिर भी मॉडल गुणों के आधार पर कुछ प्रकार के UI सक्षम करें। की जाँच करें मार्टिन फाउलर की उत्कृष्ट सिंहावलोकन MVC, एमवीपी और whatnot के विभिन्न जायके की: आप डिजाइन विचारों कसरत से मिल जाएगा। मुझे लगता है कि आप यूआई को यह बताने के लिए डिपेंडेंसी इंजेक्शन का भी इस्तेमाल कर सकते हैं कि व्यक्तिगत संस्थाओं और विशेषताओं के लिए किस तरह के नियंत्रण व्यवहार्य हैं।

चिंताओं को अलग करने का आपका उद्देश्य महान है; लेकिन आंशिक वर्गों को पूरी तरह से विभिन्न मुद्दों (मुख्य रूप से कोड पीढ़ी और डिज़ाइन-टाइम मॉडलिंग भाषाओं के साथ) को संबोधित करने का इरादा था।


8

एक्सटेंशन विधियाँ और ViewModels इस तरह से दृश्यपटल में डेटा-लेयर ऑब्जेक्ट्स को विस्तारित करने का मानक तरीका है:

डेटा लेयर (क्लास लाइब्रेरी, पर्सन.एक्स):

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

प्रदर्शन परत (वेब ​​अनुप्रयोग) PersonalExtensions.cs:

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>);
    }
  }
}

ViewModel (विस्तारित दृश्य-विशिष्ट डेटा के लिए):

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);
}

देखें, Person.cshtml:

@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

मैं इस के साथ इसी तरह के मुद्दों था। मैंने अपने डेटा प्रोजेक्ट में अपनी आंशिक कक्षाएं अपने मामले में 'MyProject.Data' पर रखीं। MetaDataClasses को आपके व्यवस्थापक प्रोजेक्ट में नहीं जाना चाहिए क्योंकि आप अन्य बुद्धिमान संदर्भ बनाएंगे।

मैंने अपने मेटाडेटाक्लासेस के लिए एक नई क्लास लीब परियोजना को जोड़ा, जैसे 'MyProject.MetaData' और फिर अपने डेटा प्रोजेक्ट से इसे संदर्भित किया


1

शायद एक स्थिर विस्तार वर्ग का उपयोग करें।


अच्छा विचार। क्या आप इस बात का उदाहरण दे सकते हैं कि आपको क्या लगता है कि आपके उत्तर में पर्याप्त कार्यक्षमता है?
१६

0

मैं यहाँ गलत हो सकता हूँ, लेकिन क्या आप अपने MyProject.Admin प्रोजेक्ट में केवल ProjectMetaData वर्ग को परिभाषित नहीं कर सकते हैं?


0

बस अपनी नई परियोजना में लिंक के रूप में वर्ग फ़ाइल जोड़ें और अपने आंशिक वर्ग में समान नाम स्थान रखें।


0

2019 से आपके पास एक चाल का उपयोग करके विभिन्न विधानसभाओं में एक आंशिक वर्ग के 2 भाग हो सकते हैं। इस लेख में इस ट्रिक को समझाया और दिखाया गया है:

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

यह अपने मूल MSBuild.Sdk.Extras एक्सटेंशन का उपयोग SDK के लिए प्रोजेक्ट्स की तरह करता है, जो एक ही असेंबली में एक ही क्लास के सभी आंशिक हिस्सों को एक साथ कई प्रोजेक्ट्स का उपयोग करके, एक संकलन में प्रभावी रूप से मल्टीप्लेयर असेंबली बनाते हुए सीमित करता है। उसी परियोजना का।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.