【问题标题】:ASP.NET MVC Model Mixins?ASP.NET MVC 模型混合?
【发布时间】:2012-10-07 08:06:02
【问题描述】:

我打算在多个模型之间共享一组字段。我希望所有字段都包含在每个实体的表中(而不仅仅是一个字段表)。我更熟悉诸如 Python 之类的语言,其中这种类型的模式称为“mixin”,本质上是一个自身不存在的类(它没有被实例化/在模型类的情况)。相反,派生类只是简单地继承字段,并且它的表看起来就像字段被简单地包含在模型类中一样。

Entity Framework 中“复杂类型”的概念似乎与我正在寻找的内容非常接近,但无法包含导航属性是一个杀手锏。有没有其他方法可以做到这一点,或者如果复杂类型是答案,那么我应该如何处理导航属性?

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    我在一本书中读过这个注释:

    除了基类和接口之外,一个有趣的可能性是 mixin,但它们是 .NET 语言不支持的 OOP 特性。 mixin 是一个类,它提供了其他类可以继承的特定功能,但它并不意味着是一个独立的类。换句话说,mixin 就像一个接口,其中一些成员可能包含预定义的实现。一些动态语言支持 Mixin,包括 Python 和 Ruby。目前没有任何 .NET 语言支持 mixins,但可以使用诸如 Castle 之类的 ad hoc 框架来模拟 mixins。动态代理。使用此框架,您首先定义一个类,该类包含您要在现有类中注入的所有方法——mixin。接下来,您使用框架为包含注入方法的给定类创建代理。 Castle.DynamicProxy 在内部使用 Reflection.Emit 来解决问题。

    【讨论】:

    • 抱歉,TPT 几乎完全是我不想要的。我不希望“mixin”拥有自己的表格。基本上,我只是在寻找一种将一组公共字段添加到其他模型的方法,而不必将集合复制并粘贴到每个模型中。他们会从基类(当然还有抽象类)继承字段,但他们会将其视为直接在派生类上定义的字段。主要问题涉及以 Entity Framework 可以理解的方式执行此操作。
    • 好的,您可以在此链接中阅读 c# 中的 mixins:stackoverflow.com/questions/255553/…,我会在获得更多信息后立即编辑我的答案 :)
    【解决方案2】:

    您可以使用继承来做到这一点。如果你已经考虑过了,我很抱歉。代码如下。

    public abstract class WidgetBase 
    {
        public string Name { get; set; }
    }
    
    public class SweetWidget : WidgetBase 
    {
        public int SweetnessFactor { get; set; }
    }
    
    public class SourWidget : WidgetBase
    {
        public int Sourness { get; set; }
    }
    

    然后在你的模型配置中,你这样做:

    const string discriminator = "WidgetType";
    Map<SweetWidget>(mc => mc.Requires(discriminator).HasValue("Sweet"));
    Map<SourWidget>(mc => mc.Requires(discriminator).HasValue("Sour"));
    

    您需要在表格中添加一列“WidgetType”。然后 EF 将按照映射中的指定填充它。

    请注意,基类必须是抽象的。只要您的表包含所有派生类的所有字段,这就是您在 EF Code First 中执行 Table Per Hierarchy 的方式。

    【讨论】:

    • 是的,很抱歉,显然,我很难回答这个问题。我实际上已经在其他地方实施了 TPH。我在这里寻找的基本上只是干燥的。就应用程序和数据库而言,在您的示例中只会有 Sweet and Sour。他们每个人都有一个“名称”字段,仅此而已。除了添加“名称”字段之外,“WidgetBase”的存在没有其他目的。它不会有一个表,我永远不会在代码中的任何其他地方使用它,除了从它继承 Sweet and Sour。
    • 物有所值。我正在寻找更接近 TPC(每混凝土表类型),尽管从长远来看,这需要太多的连线代码实际上是值得的,或者实体框架的 ComplexType。问题是,无论使用哪种方法,我都不能包含导航属性。也许,这是不可能的,但我很难相信任何现代 MVC 框架不会仅仅为了 DRY 的目的而考虑混合/抽象形式的继承。
    【解决方案3】:

    实际上有机会与 Entity Framework 的一位开发人员讨论这个问题。目前在技术上是不可能的。它显然被踢了,但目前没有人在处理它。复杂类型是一种版本,但它们当然不支持导航属性。感谢所有为我努力的人。

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多