我发现分部方法非常有用,但没有分部属性.他们没有被包括在内有充分的理由吗?我的替代方案是什么

本文关键字:理由 我的 方案 是什么 有用 非常 方法 发现 包括 他们 属性 | 更新日期: 2023-09-27 18:28:38

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

实体框架迫使类承担多种责任(常规逻辑、基本注释和CRUD接口功能)。我只想参加一个班通常会有的课程。。。并通过实体框架和规则逻辑分离类的持久能力。


我的思考过程:最近我开始研究实体框架,但不喜欢一些实体类做得太多的想法。逻辑,与数据访问接口,以及实体框架注释。为了解决这个问题,我想使Entity类文件成为部分文件,并实现远离类的其他方面的数据访问功能。这个效果很好,而且非常干净!

当我这样做的时候,我认为将我的属性部分化,并使实现远离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注释!

我发现分部方法非常有用,但没有分部属性.他们没有被包括在内有充分的理由吗?我的替代方案是什么

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

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

SomePartialMethod();  

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

string x = SomePartialProperty;

这对于编译器来说是不可能完全擦除的。这个表达式必须给x赋值,否则程序根本无法编译。为了实现这一点,编译器可能必须为x选择一个合适的默认值。它当然可以做到这一点,(比如default(T),但我认为这是决定不具有此功能的因素。

虽然partial主要用于代码生成,但我发现在类中划分不同的职责是很有用的,我认为不建议更改我的代码库,以便于在我自己的个人项目中进行小级别的分离。我从来没有见过这样做的领域。。。除了代码生成之外。

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

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

[EDIT]但你很可能会对属性上的注释进行分离,但我想知道。。。

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