实体框架4.1实体上的松散耦合

时间:2011-12-08 14:02:50

标签: c# interface entity-framework-4.1 data-annotations loose-coupling

如果有人能够对此有所了解,那么需要一点帮助。

我已经创建了一个代码优先的MVC 3应用程序,我工作正常。我现在正在重构以尽可能多地删除耦合,因为我希望稍后在各种其他MVC 3应用程序中使用域模型。我现在拥有的是一组实体,这些实体通过规范化数据库保存,并通过存储库模式进行CRUD。我已经使用Ninject通过控制器的构造函数对存储库进行了DI操作,并使用MVC 3项目中的模型充当DAO。

因此,在域内我有一个名为 Case 的实体,该实体具有另一个客户端的外键,如下所示:

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 的实例。我在这里完全错了还是有办法解决这个问题?

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

我们正在构建EF Code First实体,我们并未计划向实体添加接口。存储库获取接口。工作单元获得接口。实体没有。存储库返回具体实体,即POCO。实体可以耦合到相关实体。模型和其他类通常会获得注入的存储库接口和/或工作单元接口。对于测试,我们只需新建一些POCO实体并从模拟存储库返回它们。

我们计划将相关的POCO属性设置为虚拟,以便EF可以创建代理。

如果你想将视图与具体实体分离,我首先会问你希望从中获得什么价值。视图是否会与不同的实体一起重用?如果是这样,一个选项是使用类似AutoMapper的内容来复制属性。但是,您必须知道延迟加载属性的立即访问。