我发现部分方法非常有用,但没有部分属性.有没有充分的理由不包括在内?我有什么选择?

Chr*_*ski 3 .net c#

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

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


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

当我这样做的时候,我认为让我的属性变得偏袒是非常有益的,并且远离EF Property Annotations实现!这样可以清理文件并允许单一责任.但是,这是不允许的!游民.

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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(); }
}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 8

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

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

SomePartialMethod();  
Run Code Online (Sandbox Code Playgroud)

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

string x = SomePartialProperty;
Run Code Online (Sandbox Code Playgroud)

编译器无法完全擦除.这个表达式必须为xelse 分配一些值,程序根本无法编译.为了使这项工作,编译器可能必须为其选择适当的默认值x.它当然可以做到这一点,(default(T)但我想这是因为没有这个功能的决定.