Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我发现分部方法非常有用,但没有分部属性。有没有一个很好的理由不包括它们?我的选择是什么?_C#_.net - Fatal编程技术网

C# 我发现分部方法非常有用,但没有分部属性。有没有一个很好的理由不包括它们?我的选择是什么?

C# 我发现分部方法非常有用,但没有分部属性。有没有一个很好的理由不包括它们?我的选择是什么?,c#,.net,C#,.net,更新: 请注意,我知道我做不到这一点…这是我真的希望可以工作。也许有别的办法可以把责任分开,不是吗?所以我要找的是 实体框架将多个职责强制到类中(常规逻辑、基本注释和CRUD接口能力)。我只想把通常所有的东西都放在一个类中…并通过实体框架和常规逻辑分离类的持久能力 我的思考过程:最近我进入了实体框架,但不喜欢某些实体类做得太多的想法。逻辑,与数据访问接口,以及实体框架注释。为了解决这个问题,我想使我的实体类文件成为部分文件,并实现与类的其他方面不同的数据访问功能。这个很好用,很干净 当我这么做

更新: 请注意,我知道我做不到这一点…这是我真的希望可以工作。也许有别的办法可以把责任分开,不是吗?所以我要找的是

实体框架将多个职责强制到类中(常规逻辑、基本注释和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注释

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

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

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

string x = SomePartialProperty;

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

虽然
部分
主要用于代码生成,但我发现在类中划分不同的职责是有用的,我认为不建议更改我的代码库,以便于在我自己的项目上实现这种小小的分离ects。我从来没有在现场见过这样做……除了代码生成之外

我不知道这是否是一个个人项目,但如果是的话,我会使用partial,就像你必须分离出持久性项目一样。我看过一些网站,它们通过在数据库代码和业务逻辑之间创建另一个层次来进一步分离这个项目。如果你以前从未这样做过,那么实现它可能是一个负担,并添加It’你的项目有很多课程

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

[编辑]但是你很可能因为属性上注释的分离而失去了外观,但是我想知道


如果您在持久性分部类中声明了属性,但在常规业务逻辑分部类中调用了getter和setter private方法!?!?这样,逻辑就位于该分部类中,而注释将位于您需要它们的另一分部类中

您可以通过删除该问题来恢复任何损失的声誉。不管怎样,它很可能很快就会被关闭或删除。关于实际代码的问题也更多。这是一个将开始讨论的问题,因此不适合这样做。此外,没有办法提供帮助,因为您正在谈论一个您希望在c#中看到的功能,而不是一个已经存在的功能。这不是一个坏问题。我很抱歉我很确定你可以把它改写成这样:“我觉得分部方法非常有用,但是没有分部属性。没有分部属性有什么好的理由吗?我的备选方案是什么?”在你的建议下,隐藏着一个真正的编程问题。(您确实需要稍微更改内容,而不仅仅是标题:))您可能想了解一下
持久性无知
,以及为什么让每个实体从
IPersientEntity继承是一件“坏事”关于您的请求的基本知识:请考虑每个人都喜欢看到短代码块——短类、方法和属性。并不是真的让它们变短,它假装概述并导致类承担很多责任。好的…谢谢你的信息!但是你看到了我想要的解决方法吗?将所有持久性逻辑从实体逻辑中分离出来吗?我确信编译器可以在以后的版本中做**一些**事情,允许类似的事情我想做的事,