c# - 建模 "I' m a * 但我也是一个 **”

标签 c# oop entity-framework design-patterns inheritance

在 [ this post ],我正在努力实现@jonp 建议的状态模式。我不太明白如何使用他发布的内容,但这让我想到也许我正在尝试将方形钉子装入圆孔中。所以我的问题:

如果我的站点访问者可以扮演多个角色,即 User 可以是 VendorEmployerAdvertiser,或者以上所有,我应该使用继承吗?我已经声明:

class Vendor : User {}
class Advertiser : User {}

等等,但是当用户既是供应商又是雇主时,不同类的实例实际上指向相同的底层对象......我不确定这是否可行。如何建模?

* 更新 *

谢谢大家(你们都得到一分(这是我所能给予的))。在过去的几天里,我一直在使用 EF、向下转换和状态模式进行深度复制。角色方法更有意义。

最佳答案

这听起来像是属性模式(或者我这样调用它)非常适合的情况。这是一种比简单继承更松散耦合的方法,可用于指定多个“行为”或在您的情况下为 User 类型.这真的没有比一个对象具有另一种对象的标签更复杂的了。

实现它的最简单方法是有一个具体的 User类,具有只读属性 IList<UserRole> (在内部这可能是一个 List<T> 字段)。你的UserRole类将是抽象的,并且VendorRole/AdvertiserRole/ETC。将从中派生,允许您将任意数量的不同角色(甚至是相同类型的角色)标记到给定用户上。这些角色还可以定义自己的自定义行为、实用方法等。

此外,您可以定义一个 GetRole<TRole> User 上的方法类以方便访问特定类型的角色(假设每个 User 只有一个特定子类型的 Role)。

旁注:您也可以考虑 decorator patern ,它与上面提到的模式密切相关——尽管我个人觉得它在这里有点矫枉过正,并且在灵 active 或功能方面确实没有增加任何东西。它通常只是掩盖了您要尝试做的事情;尽管无论如何请随时进行调查。

关于c# - 建模 "I' m a * 但我也是一个 **”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395597/

相关文章:

c# - Winforms 中自定义控件绘画的最佳实践?

c# - 没有管理权限的本地主机上的自托管 REST API

javascript - 寄生虫组合继承 : How does parent prototype's clone consist child prototype's property which has not been assigned yet?

java - 创建具有大量属性的对象的更好方法

entity-framework - Entity Framework 迁移问题

entity-framework - Entity Framework 代码优先和连接字符串问题

c# - MonoMac - 游戏中心

c# - 为什么 CLR 需要一个专门的线程来调用 finalize 方法?

java - 检查通用实例?

c# - EF 核心多对多配置不适用于 Fluent API