我正在编写一个在服务器上具有POCO实体框架数据访问权限的应用程序。当RIA服务在Silverlight中创建模型时,它会生成(让我们称之为)“RIA服务”模型。也就是说,它不仅仅是我的POCO的副本。首先,模型中的这些类是密封的,例如将Lists暴露为EntityCollections。
由于它们是密封的,我无法将它们扩展到(比如说)提供额外的功能(不属于服务器)或实现接口。
但是,我可以通过实现定义的部分方法,并为其他部分类添加额外的属性来扩展这些类的功能。这样做通常是气馁的。它是某种代码味道吗?我不应该这样做有充分的理由吗?
答案 0 :(得分:3)
我们经常使用partial
实现,但我发现它不是代码味道。事实上,我认为它比用更多代码包装更好。那时,您可以跳过RIA并编写自己的WCF更改跟踪器...但我离题了。
如果您想要一个丰富的域模型,那么partial
实现是实现这一目标的一种很好的方法。默认代码生成器为WCF RIA实体的生命周期中最有意义的点创建部分方法。通过实施这些部分,您可以远离Anemic Domain Model。
如上所述,您可以实现一个接口并创建自己的方法和属性。 IOW您不仅限于实现partial
存根。如果所有其他方法都失败了,modify the default code generator会根据自己的喜好。我这样做是为了从每个实体中删除sealed
以使测试更容易。
更新:以下是我移除sealed
[DomainServiceClientCodeGenerator(typeof (CustomClientCodeGenerator), "C#")]
public class CustomClientCodeGenerator : CSharpClientCodeGenerator
{
private EntityGenerator _entityGenerator;
protected override EntityGenerator EntityGenerator
{
get { return _entityGenerator ?? (_entityGenerator = new CustomEntityGenerator()); }
}
private class CustomEntityGenerator : CSharpEntityGenerator
{
public override string TransformText()
{
return base.TransformText().Replace("sealed ", string.Empty);
}
}
}