当前位置:  开发笔记 > 后端 > 正文

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

如何解决《是否有可能在不同的程序集中有两个部分类代表同一个类?》经验,为你挑选了3个好方法。

我在名为"MyProject.Data"的项目中有一个名为"Article"的类,它充当我的Web应用程序的数据层.

我有一个名为"MyProject.Admin"的独立项目,它是一个基于Web的管理系统,用于查看/编辑数据,并使用ASP.NET动态数据构建.

基本上我想使用部分类扩展Article类,这样我就可以使用"UIHint"扩展器扩充其中一个属性,这将允许我用FCKEdit控件替换普通的多行文本框.

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

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

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

如果部分类与原始部分类在同一个项目中 - 即MyProject.Data项目,这一切都可以正常工作.

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

但是,如果我这样做,功能就会丢失.

我的基本问题是:我可以在单独的项目中有2个部分类,但两者都指的是同一个"类"吗?

如果没有,有没有办法完成我正在尝试做的事情,而不将数据层逻辑与UI逻辑混合在一起?



1> Darin Dimitr..:

不,您不能在两个不同的程序集(项目)中引用两个部分类来引用同一个类.编译程序集后,元数据将被烘焙,您的类不再是部分数据.部分类允许您将同一类的定义拆分为两个文件.



2> Pontus Gagge..:

如上所述,部分类是编译时现象,而不是运行时.程序集中的类根据定义是完整的.

在MVC术语中,您希望将视图代码与模型代码分开,然后基于模型属性启用某些类型的UI.看看Martin Fowler对MVC,MVP等各种风格的精彩概述:你会发现很多设计理念.我想你也可以使用依赖注入来告诉UI哪种控件对于单个实体和属性是可行的.

你分离关注点的目的很棒; 但是,部分类旨在解决完全不同的问题(主要是代码生成和设计时建模语言).



3> 小智..:

扩展方法和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 + " " + person.Surname);
    }
  }
}

ViewModel(用于扩展视图特定数据):

using Data.BusinessObjects
namespace MyProject.Admin.ViewModels
{
  public static class PersonViewModel
  {
    public Person Data {get; set;}
    public Dictionary MetaData {get; set;}

    [UIHint("FCKeditor")]
    public object PersonDetails { get { return Data.Details; } set {Data.Details = value;} }
  }
}

Controller 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

@Model.Data.GetFormattedName()

  • @Model.MetaData["comments"]
  • @Model.MetaData["employer_comments"]
@Html.EditorFor(m => m.PersonDetails)

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有