是否有可能在不同的程序集中有两个部分类表示同一个类?

我在一个名为“MyProject.Data”的项目中有一个名为“Article”的类,它作为我的Web应用程序的数据层。

我有一个名为“MyProject.Admin”的单独项目,它是一个用于查看/编辑数据的基于Web的pipe理系统,并使用ASP.NETdynamic数据构build。

基本上我想扩展文章类,使用部分类,以便我可以用“UIHint”扩展器来扩充其属性之一,这将允许我用FCKEdit控件replace正常的多行文本框。

我的部分类和扩展器看起来像这样:

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

现在,这一切工作正常,如果部分类是在原来的部分类相同的项目 – 即MyProject.Data项目。

但UI行为不应该在数据层中,而应该在Admin层中。 所以我想把这个类移到MyProject.Admin。

但是,如果我这样做,function会丢失。

我的根本问题是:我可以在单独的项目中有两个部分类,但都指的是相同的“类”?

如果没有,有没有办法完成我想要做的事情,而不是将数据层逻辑与UI逻辑混合?

不,你不能在两个不同的程序集(项目)中引用两个不同的类。 一旦程序集编译完成,元数据就会被烘焙,而你的类不再是部分的。 部分类允许您将同一类的定义分成两个文件。

如上所述,部分类是编译时现象,而不是运行时。 组件中的类根据定义完成。

在MVC术语中,您希望将视图代码与模型代码分开,并根据模型属性启用某些types的UI。 看看Martin Fowler对MVC,MVP和不同风格的精彩概述 ,你会发现很多devise思想。 我想你也可以使用dependency injection来告诉UI什么样的控件是可行的个人实体和属性。

你分开顾虑的目的是很大的。 但部分类旨在解决完全不同的问题(主要是代码生成和devise时build模语言)。

扩展方法和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;} } } 

显示层(Web应用程序)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不应该在您的pipe理项目中,因为您将创build一个循环引用其他明智的。

我为我的MetaDataClasses添加了一个新的类库项目,例如“MyProject.MetaData”,然后从我的数据项目中引用

也许使用一个静态的扩展类。

只要在你的新项目中添加类文件作为链接,并保持在你的部分类相同的名称空间。

我可能在这里弄错了,但是你能不能简单地在你的MyProject.Admin项目中定义ProjectMetaData类?