是否有可能在不同的程序集中有两个部分类表示同一个类?
我在一个名为“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类?
- 使用Twitter API 1.1 oAuthvalidation和请求用户的时间表
- Server.MapPath(“。”),Server.MapPath(“〜”),Server.MapPath(@“\”),Server.MapPath(“/”)。 有什么不同?
- 在c#中创buildiCal文件
- 无法让sql server compact 3.5 / 4与ASP .NET MVC 2一起工作
- ASP.NET MVC 1.0 AfterBuilding视图在TFS Build上失败
- replacestring中的最后一个单词 – c#
- 在ASP.NET / C#中使用Plupload
- 在SQL Server 2008中启用Service Broker
- “&”字符会破坏存储在web.config中的密码