다른 어셈블리의 두 부분 클래스가 같은 클래스를 나타내는 것이 가능합니까?
나는 '나의 프로젝트'라는 프로젝트에 '기사'라는 수업이 있습니다.내 웹 애플리케이션의 데이터 계층 역할을 하는 '데이터'.
저는 '나의 프로젝트'라는 별도의 프로젝트를 가지고 있습니다.admin'은 데이터를 보거나 편집하기 위한 웹 기반 관리 시스템으로 ASP.NET Dynamic Data를 사용하여 구축되었습니다.
기본적으로 저는 부분 클래스를 사용하여 아티클 클래스를 확장하여 "UI힌트" 익스텐더로 속성 중 하나를 보강하여 일반적인 다중 줄 텍스트 상자를 FCK 편집 컨트롤로 바꿀 수 있도록 하고 싶습니다.
부분 클래스 및 익스텐더는 다음과 같습니다.
[MetadataType(typeof(ProjectMetaData))]
public partial class Project
{
}
public class ProjectMetaData
{
[UIHint("FCKeditor")]
public object ItemDetails { get; set; }
}
부분 클래스가 원래 부분 클래스와 동일한 프로젝트(즉, MyProject)에 있는 경우 이 모든 것이 정상적으로 작동합니다.데이터 프로젝트.
그러나 UI 동작은 데이터 계층이 아니라 관리 계층에 있어야 합니다.그래서 이 수업을 마이프로젝트로 옮기고 싶습니다.관리자.
하지만 그렇게 하면 기능이 없어집니다.
제 근본적인 질문은: 두 개의 부분적인 수업을 별개의 프로젝트에서 할 수 있을까요? 하지만 두 수업 모두 같은 "수업"을 언급할 수 있을까요?
그렇지 않다면 UI 논리와 데이터 계층 논리를 혼합하지 않고 제가 하려는 일을 수행할 수 있는 방법이 있을까요?
아니요, 두 개의 다른 어셈블리(프로젝트)에서 동일한 클래스를 참조하는 두 개의 부분 클래스를 가질 수 없습니다.어셈블리가 컴파일되면 메타데이터가 구워지고 클래스가 더 이상 부분적이지 않습니다.부분 클래스를 사용하면 동일한 클래스의 정의를 두 개의 파일로 분할할 수 있습니다.
설명한 것처럼 부분 클래스는 런타임이 아닌 컴파일 시간 현상입니다.어셈블리의 클래스는 정의에 따라 완료됩니다.
MVC 용어에서는 뷰 코드를 모델 코드와 별도로 유지하면서 모델 속성을 기반으로 특정 종류의 UI를 활성화하고자 합니다.MVC, MVP 및 기타 다양한 맛에 대한 Martin Fowler의 훌륭한 개요를 확인하십시오. 디자인 아이디어가 풍부하다는 것을 알게 될 것입니다.의존성 주입을 사용하여 UI에 개별 엔티티 및 속성에 대해 사용 가능한 컨트롤의 종류를 알려줄 수도 있습니다.
우려 사항을 분리하려는 당신의 목표는 훌륭하지만 부분 수업은 완전히 다른 문제(주로 코드 생성 및 설계 시간 모델링 언어)를 해결하기 위한 것이었습니다.
확장 방법 및 ViewModel은 다음과 같이 프런트 엔드에서 데이터 계층 개체를 확장하는 표준 방법입니다.
데이터 계층(클래스 라이브러리, 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>);
}
}
}
View Model(확장된 뷰 관련 데이터의 경우):
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);
}
View, 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)
기본 파일을 연결 파일로 프로젝트에 추가합니다.여전히 부분적이지만 두 프로젝트 간에 공유하고 동기화 상태를 유지하며 부분 클래스에 버전/프레임워크별 코드를 가질 수 있습니다.
저도 비슷한 문제가 있었습니다.저는 제 데이터 프로젝트에서 부분 수업을 유지했습니다. 그래서 당신의 경우는 '내 프로젝트'입니다.Data'. MetaDataClasss는 관리 프로젝트에 포함되지 않아야 합니다. 그렇지 않으면 순환 참조를 만들 수 있습니다.
MetaDataClasses에 대한 ClassLib 프로젝트를 새로 추가했습니다. 예를 들어 'MyProject'입니다.MetaData'를 선택한 다음 내 데이터 프로젝트에서 이를 참조했습니다.
정적 확장 클래스를 사용합니다.
클래스 파일을 새 프로젝트의 링크로 추가하고 부분 클래스에 동일한 네임스페이스를 유지하기만 하면 됩니다.
2019년부터 트릭을 사용하여 다른 어셈블리에서 부분 클래스의 두 부분을 가질 수 있습니다.이 방법은 다음 문서에서 설명하고 설명합니다.
핵심에는 MSBuild를 사용합니다.Sdk.Sdk.동시 대상이 여러 개인 하나의 프로젝트를 사용하여 동일한 프로젝트의 하나의 컴파일에 여러 개의 어셈블리를 효과적으로 생성함으로써 클래스의 모든 부분 요소를 동일한 어셈블리에 포함시키는 제한을 해결하는 SDK와 같은 프로젝트로 확장합니다.
여기서 제가 잘못 알고 있는 것일 수도 있지만, 단순히 제 프로젝트에서 ProjectMetaData 클래스를 정의할 수는 없습니다.관리 프로젝트?
언급URL : https://stackoverflow.com/questions/647385/is-it-possible-to-have-two-partial-classes-in-different-assemblies-represent-the
'programing' 카테고리의 다른 글
Android ADT 제거 (0) | 2023.05.21 |
---|---|
노드 / Express: EADDRINUSE, 주소가 이미 사용 중 - 서버 종료 (0) | 2023.05.21 |
Node.js 'require'를 절대로 만들려면 어떻게 해야 합니까?(상대값 제외) (0) | 2023.05.21 |
Swift 3에서 디스패치 대기열을 생성하는 방법 (0) | 2023.05.21 |
페이지화를 위해 MongoDB 집계를 사용하는 방법은 무엇입니까? (0) | 2023.05.21 |