gpt4 book ai didi

c# - 我发现部分方法非常有用,但没有部分属性。他们没有被包括在内有充分的理由吗?我有什么选择?

转载 作者:行者123 更新时间:2023-11-30 13:47:14 25 4
gpt4 key购买 nike

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

Entity Framework 将多重职责强加到类中(常规逻辑、基本注解和 CRUD 接口(interface)能力)。我只想把通常所有的东西都放在一个类中……并通过 Entity Framework 和常规逻辑将类的持久能力分开。


我的思考过程:最近我开始接触 Entity Framework,但不喜欢某些 Entity 类做得太多的想法。逻辑、数据访问接口(interface)和 Entity Framework 注释。为了解决这个问题,我想让我的实体类文件部分化,并在类的其他方面实现数据访问功能。这很好用而且非常干净!

当我这样做时,我认为将我的属性设为部分属性并使实现远离 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 成员的基本设计理念。目标是简单地定义一个代码生成器可以在需要时插入额外逻辑的 stub 。如果生成的代码没有填写方法,那么所有对 partial stub 的调用都将从最终程序中删除。

为了实现这个目标,partial 方法有一些非常有限的限制,包括它必须返回 void。这使得它很容易被编译掉,因为如果它被删除,就没有任何值(value)可以保留

SomePartialMethod();  

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

string x = SomePartialProperty;

编译器不可能完全抹掉这个。此表达式必须为 x 分配一些值,否则程序根本无法编译。为了使这项工作正常进行,编译器可能必须为 x 选择一个合适的默认值。它当然可以做到这一点,(比如 default(T) 但我想这是决定不具有此功能的一个因素。

关于c# - 我发现部分方法非常有用,但没有部分属性。他们没有被包括在内有充分的理由吗?我有什么选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com