更新:请注意,我知道我不能这样做......这是我真正希望可以工作的.也许还有其他方式将责任分开,不是吗?所以我要找的是......
实体框架强制将多个职责强加到类中(常规逻辑,基本注释和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注释!
没有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)但我想这是因为没有这个功能的决定.
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |