3

更新:请注意,我知道我不能这样做……这是我真正希望能够做到的。也许还有其他方式可以分开责任,不是吗?所以我要找的是...

Entity Framework 将多个职责强制到类中(常规逻辑、基本注释和 CRUD 接口能力)。我只想采用通常都在一个类中的东西......并通过实体框架和常规逻辑分离类的持久能力。


我的思考过程:最近我进入了实体框架,但不喜欢某些实体类做得太多的想法。逻辑、数据访问接口和实体框架注释。为了解决这个问题,我想让我的实体类文件部分化,并实现数据访问功能,使其远离类的其他方面。这很好用而且很干净!

当我这样做的时候,我认为使我的属性部分化,并使实现远离 EF 属性注释将是非常有益的!这将清理文件并允许单一责任。但是,这是不允许的!真可惜。

部分属性将像部分方法一样实现。一个部分属性中的定义,以及另一个部分属性中的实现......就像顶部链接中的照片建议(或评论)以及下面的代码一样。

public partial class Agency : PropertyValidator, IAgency
{
    private string _name;

    public partial string Name 
    {
        get { return _name; }
        set
        {
            // PropertyValidator stuff
            if (string.IsNullOrEmpty(value))
                AddErrorToProperty("Agency name must contain a reasonable alphanumeric value.");
            if (string.IsNullOrWhiteSpace(value))   
                AddErrorToProperty("Agency name cannot contain all spaces.");

            SetPropertyIfValid(ref _name, value);
        }
    }
}

然后是处理所有抽象数据库项目的另一个部分类......

public partial class Agency : IPersitentEntity, IAgency
{       
    [Key]    // NOTE these Annotations are because of Entity Framework...nice separation! 
    public int ID { get; set; } // From IPersitentEntity

    [Required]
    [MinLength(3), MaxLength(50)]
    public partial string Name { get; set; } // IAgency NOTE this is not valid, but the 
                                             // separation is amazing!

    // From IPersitentEntity provide CRUD support
    public void Create() { throw new NotImplementedException(); }
    public void Retrieve(int id) { throw new NotImplementedException(); }
    public void Update(int id) { throw new NotImplementedException(); }
    public void Delete(int id) { throw new NotImplementedException(); }
}

现在,我必须将注释和逻辑结合在一起。这有点奇怪,因为我已经分离出抽象的数据库项目......除了 EF 注释!

4

2 回答 2

8

没有partial属性的部分原因是它们不符合partial成员的基本设计理念。目标是简单地定义一个存根,如果需要,代码生成器可以在其中插入额外的逻辑。如果生成的代码没有填写方法,那么所有对partial存根的调用都将从最终程序中删除。

为了达到这个目标,一个partial方法有一些非常有限的限制,包括它必须返回void。这使得编译变得非常容易,因为如果删除它就没有可以保留的值

SomePartialMethod();  

另一方面,属性永远不能是void,它们必须是某种具体类型。因此,用户始终可以编写以下内容

string x = SomePartialProperty;

编译器不可能完全擦除。该表达式必须为程序分配一些值,x否则程序根本无法编译。为了完成这项工作,编译器可能必须为x. 它当然可以做到这一点,(比如说,default(T)但我想这是决定不具备此功能的因素。

于 2013-08-22T06:09:58.447 回答
1

虽然partial主要用于代码生成,但我发现在我认为不建议更改我的代码库以促进我自己的个人项目的小级别分离的类中分离不同的职责很有用。除了代码生成之外,我从未在该领域看到过这种情况。

我不知道这是否是一个个人项目,但如果是,我会像你必须分离出持久性项目一样使用部分。我已经查看了通过在数据库代码和业务逻辑之间创建另一个级别来进一步分离这一点的网站。如果您以前从未这样做过,那么实现它可能会很麻烦,并且会为您的项目添加大量的类。

如果这是一个个人项目,那可能不值得,并且如果您想“分离”不同的职责,那么您的部分类似乎确实有效。如果您需要更改访问数据的方式,那么您只需更改部分类,而不涉及常规业务逻辑。

[编辑] 但是你最有可能对属性上的注释进行分离,但我想知道......

如果你在持久化部分类中声明了属性,但在常规业务逻辑部分类中调用了getter和setter私有方法!?!?这样,逻辑就在那个部分类中,而注释将在您想要它们的另一个部分类中

于 2013-08-24T02:51:06.007 回答