هل من الممكن أن يكون هناك فئتان جزئيتان في تجميعات مختلفة تمثلان نفس الفئة؟

StackOverflow https://stackoverflow.com/questions/647385

سؤال

لدي فصل دراسي يسمى "مقالة" في مشروع يسمى "MyProject.Data"، والذي يعمل كطبقة بيانات لتطبيق الويب الخاص بي.

لدي مشروع منفصل يسمى "MyProject.Admin"، وهو نظام إداري قائم على الويب لعرض/تحرير البيانات، وتم إنشاؤه باستخدام ASP.NET Dynamic Data.

أريد بشكل أساسي توسيع فئة المقالة، باستخدام فئة جزئية، حتى أتمكن من زيادة إحدى خصائصها بموسع "UIHint"، والذي سيسمح لي باستبدال مربع النص العادي متعدد الأسطر بعنصر تحكم FCKEdit.

سيبدو الفصل الجزئي والموسع الخاص بي كما يلي:

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

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

الآن كل هذا يعمل بشكل جيد إذا كانت الفئة الجزئية موجودة في نفس المشروع مثل الفئة الجزئية الأصلية - أي.مشروع MyProject.Data.

لكن سلوك واجهة المستخدم لا ينبغي أن يكون موجودًا في طبقة البيانات، بل في طبقة المسؤول.لذلك أريد نقل هذا الفصل إلى MyProject.Admin.

ومع ذلك، إذا قمت بذلك، سيتم فقدان الوظيفة.

سؤالي الأساسي هو:هل يمكنني الحصول على فصلين جزئيين في مشروعين منفصلين، لكن كلاهما يشير إلى نفس "الفئة"؟

إذا لم يكن الأمر كذلك، فهل هناك طريقة لإنجاز ما أحاول القيام به، دون خلط منطق طبقة البيانات مع منطق واجهة المستخدم؟

هل كانت مفيدة؟

المحلول

لا، لا يمكن أن يكون لديك فئتان جزئيتان تشيران إلى نفس الفئة في مجموعتين (مشاريع) مختلفتين.بمجرد تجميع التجميع، يتم دمج البيانات الوصفية، ولن تعد فصولك جزئية.تسمح لك الفئات الجزئية بتقسيم تعريف نفس الفئة إلى ملفين.

نصائح أخرى

كما ذكرنا، الطبقات الجزئية هي ظاهرة وقت الترجمة، وليس وقت التشغيل.الفصول الدراسية في التجميعات هي بحكم التعريف كاملة.

في مصطلحات MVC، تريد إبقاء كود العرض منفصلاً عن كود النموذج، مع تمكين أنواع معينة من واجهة المستخدم بناءً على خصائص النموذج.الدفع نظرة عامة ممتازة لمارتن فاولر من النكهات المختلفة لـ MVC وMVP وما إلى ذلك:ستجد أفكار التصميم وفيرة.أفترض أنك يمكن أن تستخدم أيضا حقن التبعية لإخبار واجهة المستخدم بنوع عناصر التحكم القابلة للتطبيق للكيانات والسمات الفردية.

إن هدفك من فصل الهموم عظيم؛لكن الفئات الجزئية كانت تهدف إلى معالجة قضايا مختلفة تمامًا (في المقام الأول مع إنشاء التعليمات البرمجية ولغات نمذجة وقت التصميم).

تعد طرق الامتداد وViewModels الطريقة القياسية لتوسيع كائنات طبقة البيانات في الواجهة الأمامية مثل هذا:

طبقة البيانات (مكتبة الفصل، Person.cs):

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

طبقة العرض (تطبيق الويب) PersonExtensions.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;} }
  }
}

تحكم PersonController.cs:

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)

أضف الملف الأساسي كملف مرتبط إلى مشاريعك.لا يزال جزئيًا ولكنه يسمح لك بمشاركته بين كلا المشروعين، والحفاظ على مزامنتهما وفي نفس الوقت الحصول على كود خاص بالإصدار/الإطار في الفئات الجزئية.

لقد واجهت مشاكل مماثلة مع هذا.لقد احتفظت بفصولي الجزئية في مشروع البيانات الخاص بي، لذا في حالتك "MyProject.Data".لا ينبغي أن تدخل MetaDataClasses في مشروع الإدارة الخاص بك لأنك ستقوم بإنشاء مراجع دائرية بخلاف ذلك.

لقد أضفت مشروع Class Lib جديدًا لـ MetaDataClasses الخاصة بي على سبيل المثال."MyProject.MetaData" ثم أشرت إلى هذا من مشروع البيانات الخاص بي

ربما استخدم فئة الامتداد الثابتة.

قد أكون مخطئًا هنا، لكن ألا يمكنك ببساطة تحديد فئة ProjectMetaData في مشروع MyProject.Admin الخاص بك؟

ما عليك سوى إضافة ملف الفصل كرابط في مشروعك الجديد والاحتفاظ بنفس مساحة الاسم في فصلك الجزئي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top