RIA Services扩展代码生成的实体模型部分类

时间:2011-06-20 20:12:28

标签: .net silverlight entity-framework entity-framework-4 wcf-ria-services

我正在编写一个在服务器上具有POCO实体框架数据访问权限的应用程序。当RIA服务在Silverlight中创建模型时,它会生成(让我们称之为)“RIA服务”模型。也就是说,它不仅仅是我的POCO的副本。首先,模型中的这些类是密封的,例如将Lists暴露为EntityCollections。

由于它们是密封的,我无法将它们扩展到(比如说)提供额外的功能(不属于服务器)或实现接口。

但是,我可以通过实现定义的部分方法,并为其他部分类添加额外的属性来扩展这些类的功能。

这样做通常是气馁的。它是某种代码味道吗?我不应该这样做有充分的理由吗?

1 个答案:

答案 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);
        }
    }
}