有没有可能让不同程序集中的两个分部类表示同一个类?

我在一个叫做“我的项目”的项目中有一个叫做“文章”的类。数据’,它作为我的 Web 应用程序的数据层。

我有一个单独的项目叫做“我的项目”。Admin’是一个基于 Web 的管理系统,用于查看/编辑数据,并使用 ASP.NET Dynamic Data 构建。

基本上,我想使用一个分部类来扩展 Article 类,这样我就可以用一个“ UIHint”扩展器来扩展它的一个属性,这个扩展器允许我用一个 FCKEdit 控件替换普通的多行文本框。

我的部分类和扩展程序如下所示:

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


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

现在,如果分部类与原始分部类(即 MyProject)位于同一个项目中,那么所有这些都可以正常工作。数据项目。

但是 UI 行为不应该位于数据层,而应该位于管理层。所以我想把这个类移到 MyProject。管理员。

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

我的基本问题是: 我可以在不同的项目中有两个部分类,但是都指同一个“类”吗?

如果没有,是否有一种方法可以实现我正在尝试做的事情,而不需要将数据层逻辑与 UI 逻辑混合在一起?

51401 次浏览

不能有两个分部类在两个不同的程序集(项目)中引用同一个类。一旦编译了程序集,元数据就被嵌入进来,您的类就不再是分部的了。分部类允许您将同一类的定义拆分为两个文件。

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

用 MVC 的术语来说,您希望将视图代码与模型代码分开,同时根据模型属性启用某些类型的 UI。看看 Martin Fowler 的精彩概述的不同风格的 MVC,MVP 和诸如此类的东西: 你会发现设计思路丰富。我想您还可以使用 依赖注入来告诉 UI 哪种类型的控件对于单独的实体和属性是可行的。

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

这里我可能有些误会,但是您能不能不要简单地在 MyProject.Admin 项目中定义 ProjectMetaData 类呢?

我也遇到过类似的问题。我在我的数据项目中保留了我的部分类,所以在你的例子中是“我的项目”。百科。MetaDataClass 不应该放在管理项目中,否则将创建循环引用。

我为我的 MetaDataClass 添加了一个新的 Class Lib 项目,例如‘ MyProject。然后从我的数据项目中引用这个

将基文件作为链接文件添加到项目中。它仍然是部分的,但是它允许您在两个项目之间共享它,保持它们的同步,同时在部分类中有版本/框架特定的代码。

也许可以使用静态扩展类。

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

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

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)

自2019年以来,您可以使用一个技巧在不同的程序集中拥有一个分部类的2个部分。这个技巧在本文中得到了解释和演示:

Https://www.notion.so/vapolia/secret-feature-xamarin-forms-control-s-auto-registration-1fd6f1b0d98d4aabb2defa0eb14961fa

它的核心使用 MSBuild。Sdk.类似于 SDK 项目的额外扩展,通过使用一个项目和多个并发目标,有效地在同一个项目的一次编译中创建多个程序集,解决了类的所有部分在同一个程序集中的局限性。