2013-04-29 74 views
0

我想听到下面的一些建议和意见:动态扩展的类

比方说,你有一些实体:NewsPiece,博文,文章

一般情况下是非常相似的对方,所以我做了一个泛型类

public abstract class InformationItem<TParent, TChild, TLike> 
    where TParent : InformationItem<TParent, TChild, TLike> 
    where TChild : InformationItemChild<TParent, TChild, TLike> 
    where TLike : InformationItemLike<TParent, TChild, TLike> 
{ 
    [Key] 
    public int Id { get; set; } 

    protected ICollection<TChild> childItems; 

    public virtual ICollection<TChild> ChildItems 
    { 
     get { return childItems ?? (childItems = new List<TChild>()); } 
     protected set { childItems = value; } 
    } 

    //and so on... 
} 

类似的定义是在儿童和类一样,所以我才能够定义BaseInformationService,并以此为基础实现了我的信息项的所有操作(创建,编辑,发表评论,得到最近的等等...)。

但最近我遇到了一个问题 - 这样的强制执行派生类的结构,使得不需要评论(例如)有不必要的功能类。所以我决定让这个实现更灵活一点 - 我想要有一些像InformationItemServiceBuilder那样的方法,例如.WithComments或.WithLikes,它们只能用所需的功能构建信息项服务。

你建议哪一种方法或设计模式?我应该尝试装饰,还是其他更适合?预先感谢您的回复。

回答

1

你有没有使用一个dynamic对象考虑? DLR允许您动态创建属性和方法。有几个开源项目提供了自定义实现,可以让您轻松地动态添加属性和方法,并动态实现已知接口。动态界面的实现依赖于动态代理,你可以混合在接口(例如ISupportComments)加入您的分区功能。

我建议考虑看看以下两个项目:

  1. Clay

  2. Impromptu Interface

另外,Jeremy Miller有一篇关于实现持久扩展属性的好文章,这些文章似乎与你正在尝试构建的内容一致。它可能会给你一些想法给它一个阅读:http://codebetter.com/jeremymiller/2010/02/16/our-extension-properties-story/

+0

听起来不错,我会试一试 – HardLuck 2013-04-29 17:01:03

+0

所以,我试图使用这个,但这不是我所需要的 - 它只允许动态对象适用于接口实现者,但这不是重点。任何其他想法? – HardLuck 2013-05-04 00:37:39

+0

@HardLuck - 我相信你误解了这些库的局限性。 Clay上的文章展示了如何动态构建深度对象图(支持评论等)。然而,总的来说,我认为你的解决方案有点过度设计,你最好创建一个从最小非泛型基类派生的具体类。然后,您可以通过ORM配置隐式处理子类型的变体......但这就是我将如何处理它。 – smartcaveman 2013-05-05 02:24:59