实体框架4.1实体的松耦合
本文关键字:实体 耦合 框架 | 更新日期: 2023-09-27 18:17:06
需要一点帮助,如果有人可以提供一些光。
我已经创建了一个代码优先的MVC 3应用程序,我工作得很好。我现在正在重构以尽可能多地删除耦合,因为我希望在以后的各种其他MVC 3应用程序中使用域模型。我现在拥有的是一组实体,它们通过规范化数据库持久化,并通过存储库模式进行CRUD-ed。我已经使用Ninject通过控制器的构造函数来DI存储库,并使用MVC 3项目中的模型作为dao。
在域内,我有一个名为Case的实体,它有一个指向另一个CaseClient的外键,看起来像这样:
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是一个新的东西,它返回一个空对象。当类型是一个具体类时,它返回fine -我认为这是因为EF4.1试图创建一个IClient的实例。是我完全错了,还是有别的办法?
我的第二个问题(这可能否定我的第一个问题)是我也做了一些错误的添加数据注释到继承我的域实体的接口视图模型?我应该使用模型元数据吗?如果是这样,我如何使用元数据,使数据注释对每个项目都是唯一的,而不触及域?
谢谢!
警告:我不是EF或MVC3的专家。
我们正在构建EF Code First实体,我们不打算为实体添加接口。存储库获得接口。工作单元获得接口。实体不。存储库返回具体的实体,即poco。实体可以耦合到相关实体。模型和其他类通常会被注入存储库接口和/或工作单元接口。为了进行测试,我们将新建一些POCO实体,并从模拟存储库返回它们。
我们计划将相关的POCO属性虚拟化,以便EF可以创建代理。
如果你想将视图与具体实体解耦,我首先会问你希望从中获得什么价值。视图会被不同的实体重用吗?如果是这样,一种选择是使用AutoMapper之类的东西来复制属性。但是,您必须注意延迟加载属性的即时访问。