0

如果有人可以对此有所了解,请提供一些帮助。

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

因此,在域中,我有一个名为Case的实体,它具有另一个案例Client的外键,如下所示:

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; }    
}

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

我的第二个问题(这可能会否定我的第一个问题)是通过将数据注释添加到继承域实体接口的视图模型中,我是否也做错了什么?我应该使用模型元数据吗?如果是这样,我如何使用元数据以使每个项目的数据注释都是唯一的,而无需触及域?

谢谢!

4

1 回答 1

3

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

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

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

如果您想将视图与具体实体分离,我首先要问您希望从中获得什么价值。视图会被不同的实体重用吗?如果是这样,一种选择是使用AutoMapper之类的东西来复制属性。不过,您必须注意延迟加载属性的即时访问。

于 2011-12-08T16:07:42.360 回答