Возможно ли иметь два частичных класса в разных сборках, представляющих один и тот же класс?


У меня есть класс под названием 'Article' в проекте под названием 'MyProject.Data', который выступает в качестве уровня данных для моего веб-приложения.

У меня есть отдельный проект под названием 'MyProject.Admin', который представляет собой веб-систему администрирования для просмотра / редактирования данных, и был построен с использованием ASP.NET динамические данные.

в основном я хочу расширить класс Article, используя частичный класс, чтобы я мог увеличить одно из его свойств с помощью расширителя "UIHint", который позволит мне заменить обычное многострочное текстовое поле с элементом управления FCKEdit.

мой частичный класс и расширитель будет выглядеть так:

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

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

теперь все это прекрасно работает, если частичный класс находится в том же проекте, что и исходный частичный класс - т. е. MyProject.Проект данных.

но поведение пользовательского интерфейса не должно находиться на уровне данных, а скорее на уровне администратора. Поэтому я хочу переместить этот класс В MyProject.Администратор.

однако, если я это сделаю, функциональность будет потерянный.

мой основной вопрос: Могу ли я иметь 2 частичных класса в отдельных проектах, но оба относятся к одному и тому же "классу"?

если нет, есть ли способ выполнить то, что я пытаюсь сделать, не смешивая логику уровня данных с логикой пользовательского интерфейса?

8 117

8 ответов:

нет, вы не можете иметь два разделяемых класса, ссылающихся на один и тот же класс в двух разных сборках (проектах). После того, как сборка компилируется, мета-данные, запеченная в, А классы более не является частичной. Разделяемые классы позволяют разделить определение одного и того же класса на два файла.

Как уже отмечалось, частичные классы-это явление времени компиляции, а не время выполнения. Классы в сборках по определению являются полными.

в терминах MVC вы хотите сохранить код представления отдельно от кода модели, но включить определенные виды пользовательского интерфейса на основе свойств модели. Проверьте отличный обзор Мартина Фаулера из различных вкусов MVC, MVP и еще много чего: вы найдете дизайнерские идеи в изобилии. Я полагаю, вы могли бы также использовать Инъекции Зависимостей показать пользовательский интерфейс какие элементы управления являются жизнеспособными для отдельных сущностей и атрибутов.

ваша цель разделения проблем велика; но частичные классы были предназначены для решения совершенно разных проблем (в первую очередь с генерацией кода и языками моделирования во время разработки).

методы расширения и ViewModels являются стандартным способом расширения объектов уровня данных в интерфейсе следующим образом:

уровень данных (библиотека классов, человек.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);
}

Вид, Лицо.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.Данные.' MetaDataClasses не должны входить в ваш проект администратора, так как вы создадите круговые ссылки по-другому.

Я добавил новый проект класса Lib для моих MetaDataClasses например 'MyProject.Метаданные", а затем ссылается на это из моего проекта данных

возможно использовать статический класс расширение.

Я могу ошибаться здесь, но не могли бы вы просто определить класс ProjectMetaData в вашем MyProject.Админ проекта?

просто добавьте файл класса в качестве ссылки в свой новый проект и сохраните то же пространство имен в своем разделяемом классе.