代码改变世界

复用 Entity Framework 中英语单复数形式变换的类

2011-09-21 21:24  鹤冲天  阅读(4666)  评论(8编辑  收藏  举报

数据库表名用复数、实体类名用单数,集合属性用复数…编程中经常会遇到英语单复数变换的问题,你能准确处理吗?对我来说,十年前或许可以,but don't worry,我们有现成的类提供些类服务,来自 EntityFrameWork。

使用 ILSpy 打开 EntityFramework.dll(v4.1),处理单复数的相关类位于 System.Data.Entity.ModelConfiguration.Design.PluralizationServices 命名空间下:

image

其中 PluralizationService 是单复数变换服务的抽象基类,定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
internal abstract class PluralizationService {
    public CultureInfo Culture {
        get;
        protected set;
    }
    public abstract bool IsPlural(string word);
    public abstract bool IsSingular(string word);
    public abstract string Pluralize(string word);
    public abstract string Singularize(string word);
    /// <summary>
    ///   Factory method for PluralizationService. Only support english pluralization.
    ///   Please set the PluralizationService on the System.Data.Entity.Design.EntityModelSchemaGenerator
    ///   to extend the service to other locales.
    /// </summary>
    /// <param name="culture">CultureInfo</param>
    /// <returns>PluralizationService</returns>
    public static PluralizationService CreateService(CultureInfo culture) {
        if (culture.TwoLetterISOLanguageName == "en") {
            return new EnglishPluralizationService();
        }
        throw new NotImplementedException("We don't support locales other than english yet");
    }
}

EnglishPluralizationService 是英文的具体实现类,包含了规则变换和不规则变换,代码太长就不贴出了。

估计很多朋友会和我一样会,担心这个实现是否完整。我简单查看了下源码,发现了这个单词:

1
pneumonoultramicroscopicsilicovolcanoconiosis

不用数了,一共是 45 个字母,这可是最长的英语单词。这么长(估计实际用的也不多)的单词都收录了,再加上 EnglishPluralizationService 类 2451 行的代码,想必非常完整了。

但不幸的是,这些类都是 internal,没法直接用。不过我们可以使用 ILSpy 把这几个类提出来,供我们享用。

ILSpy 可以将整个 dll 反编译成项目,也可以将单个类反编译成文件:

image image

但不能直接反编译一个命名空间,有点遗憾。

余下的工作的和怎么用,就不用我多说了吧。

分享一份我处理好的源码:PluralizationServices.rar (8KB,VS2010)