我想听听有关以下内容的一些建议和意见:
假设您有一些实体: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这样的方法,它们只能构建具有所需功能的信息项服务。
您建议使用哪种方法或设计模式?我应该尝试装饰,还是其他更适合的东西?提前感谢您的回复。
答案 0 :(得分:1)
您是否考虑过使用dynamic
对象? DLR允许您动态创建属性和方法。有一些开源项目提供自定义实现,可以让您轻松地动态添加属性和方法,以及动态实现已知的接口。动态接口实现依赖于动态代理,您可以使用混合接口(例如ISupportComments
)来添加分区功能。
我建议看看以下两个项目:
此外,杰里米·米勒(Jeremy Miller)有一篇关于实现持久性扩展属性的文章,这些属性似乎与您正在尝试构建的内容类似。它可能会给你一些想法,让它阅读:http://codebetter.com/jeremymiller/2010/02/16/our-extension-properties-story/