动态可扩展的类

时间:2013-04-29 14:19:08

标签: .net c#-4.0 design-patterns architecture

我想听听有关以下内容的一些建议和意见:

假设您有一些实体:NewsPiece,BlogPost,文章

一般情况下彼此非常相似,所以我制作了一个通用类

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...
}

类似的定义在Child和Like类上,所以我能够定义BaseInformationService并将其用作所有操作的基本实现,包括我的信息项(创建,编辑,发表评论,获取最近等等)。

但是最近我遇到了一个问题 - 这样的实现强制执行派生类的结构,并使不需要注释的类(例如)具有不必要的功能。所以我决定让这个实现更灵活一些 - 我希望像InformationItemServiceBuilder这样的东西会有.WithComments或.WithLikes这样的方法,它们只能构建具有所需功能的信息项服务。

您建议使用哪种方法或设计模式?我应该尝试装饰,还是其他更适合的东西?提前感谢您的回复。

1 个答案:

答案 0 :(得分:1)

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

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

  1. Clay

  2. Impromptu Interface

  3. 此外,杰里米·米勒(Jeremy Miller)有一篇关于实现持久性扩展属性的文章,这些属性似乎与您正在尝试构建的内容类似。它可能会给你一些想法,让它阅读:http://codebetter.com/jeremymiller/2010/02/16/our-extension-properties-story/