0

我想听听关于以下方面的一些建议和意见:

假设您有一些实体:NewsPiece、BlogPost、Article

一般来说,它们彼此非常相似,所以我制作了一个通用类

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 之类的方法,它们能够仅构建具有所需功能的信息项服务。

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

4

1 回答 1

1

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

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

  1. 粘土

  2. 即兴界面

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

于 2013-04-29T15:01:50.573 回答