0

松耦合需要一点点的帮助,请如果任何人可以在此提供一些线索。实体框架4.1的实体

我创建这是我工作的罚款代码优先MVC 3应用程序。我现在正在重构,以尽可能多地去除耦合,因为我希望稍后在其他各种MVC 3应用程序中使用该域模型。我现在拥有的是一组实体,它们通过规范化数据库持久化,并通过存储库模式进行CRUD编辑。我已经通过控制器的构造函数使用Ninject将DI存储到DI中,并且正在使用MVC 3项目中的模型来充当DAO。

因此,域内我有一个名为实体案例,有一个外键的另一种情况客户,看起来像这样:

public class Case : ICase 
{ 
    [Key] 
    public int CaseId { get; set; } 
    public string CaseName { get; set; } 
    public DateTime DateCreated { get; set; } 
    public IClient Client { get; set; } 
} 

然后,我有一个接口(接口主要存在将其实现到视图模型添加我的数据注释 - 我知道我可以将注释添加到域对象,但正如我所说我想要在其他应用程序中使用此域模型将具有不同的无处不在的语言。

public interface ICase 
{ 
    int CaseId { get; set; } 
    string CaseName { get; set; } 
    DateTime DateCreated { get; set; } 
    IClient Client { get; set; } 
} 

然后我在MVC 3项目中有我的视图模型。

public class CaseModel : ICase 
{ 
    [HiddenInput(DisplayValue = false)] 
    int CaseId { get; set; } 

    [Required(AllowEmptyStrings = false)] 
    [MaxLength(100)] 
    string CaseName { get; set; } 

    [RegularExpression("")] 
    DateTime DateCreated { get; set; }  

    IClient Client { get; set; }  
} 

所以,我的第一个问题是:改变了我的外键引用为客户IClient是一个新事物,它返回一个空的对象。当类型是一个具体的类时,它返回正常 - 我假设这是因为EF4.1试图创建一个实例IClient。我在这里完全错误还是有办法解决这个问题?

我(可能否定我的第一个问题)第二个问题是我我也做错了通过添加数据注解视图模型继承我的域实体的接口?我应该使用模型元数据吗?如果是这样,我该如何使用元数据,以便我可以在不触及域的情况下使每个项目的数据注释都是唯一的?

谢谢!

+0

只是为了澄清为什么解决第二个问题可能会否定我的第一个问题。这些接口存在的唯一原因是视图模型具有类似于域实体的结构。如果有一种更好的方法来将注释的元数据添加到驻留在不同程序集中的域实体中,那么这些接口不需要存在。我可以删除它们并返回使用我的域实体的具体版本。 –

+1

您不能在实体中使用接口作为导航引用。这就像在属性上放置一个'[NotMapped]'属性,EF简单地忽略了这个属性。你必须有一个具体的或抽象的类。仅用于集合,您可以使用像'ICollection '这样的接口。另一方面'T'必须再次成为一个班级,而不是一个界面。对于标准收集接口,EF具有默认规则,如何实例化它们:“ICollection - > HashSet '或'IList - > List '等。对于您定制的自定义接口,EF没有这样的规则,并且不知道如何实例化这些。 – Slauma

+0

顺便说一下,EF现在高达4.2。 – TrueWill

回答

3

警告:我不是EF或MVC3的专家。

我们在建设EF代码第一次实体的过程中,我们目前没有在接口加入实体规划。存储库获取接口。工作单元获取接口。实体不。存储库返回具体的实体,即POCO。实体可能会与相关实体耦合。模型和其他类通常会获得注入库接口和/或工作单元接口。为了进行测试,我们只需创建一些POCO实体并从模拟存储库返回。

我们打算做出相关POCO性质虚拟的,这样可以EF创建代理。

如果你想从一个具体实体中分离一个视图,我首先会问你期望从中获得什么价值。该视图是否会与不同的实体重用?如果是这样,一种选择是使用类似AutoMapper的东西来复制属性。不过,你必须意识到延迟加载属性的直接访问。

+0

嗨,感谢您的回复!我在原始消息中试图传达的是,实体的接口仅用于具有类似结构化视图模型(其中我添加了我的应用程序指定的数据注释)的目的。实体接口根本就不是用于解耦的目的。我想说,我的第一个问题基本上是我的错误。那么我的实际问题是,我该如何为指定的域实体(针对CRUD内容)应用程序创建数据注释,而不是将其硬编码到域中? –

+0

所以你说你不想把MVC HiddenInputAttribute放在实体上,对吗?我同意这一点。我会让他们在ViewModel上。将实体复制到ViewModel(手动或使用AutoMapper),或者将ViewModel委托给实体(可能更好)。再次,我不是模式专家 - [维基百科文章](http://en.wikipedia.org/wiki/Model_View_ViewModel)似乎使用委派。 – TrueWill

+1

如果你的意思是EF特有的属性像MaxLength,我会说“如果我们放弃EF我们有其他问题”或使用Fluent API来配置不同的类映射。 – TrueWill