2

我正在尝试通过使用视图模型来清理 ASP.NET MVC 项目中的操作方法。目前,我的视图模型包含可能与其他实体有关系的实体。例如,ContactViewModel 类可能有一个联系人,它可能有一个地址,两者都是独立的实体。要查询联系人对象列表,我可能会执行以下操作。

IList<Contact> contacts;

using (IContactRepository repository = new ContactRepository())
{
    contacts = repository.Fetch().ToList();
}

EditContactViewModel vm = new EditContactViewModel(contacts);

return View(vm);

这种方法带来了一些问题。例如,在 using 语句中查询存储库。到视图呈现时,上下文已经超出范围,使得视图无法查询与联系人关联的地址。我可以启用急切加载,但我不想这样做。此外,我不喜欢实体模型渗入我的视图(我觉得让我的视图了解联系人和地址之间的关系是个坏主意,但请随意不同意我的观点)。

我考虑过创建一个包含来自联系人和地址实体的属性的增肥类。然后我可以将 Contact 和 Address 实体投影到我的新扁平对象中。我对这种方法的一个担忧是我的操作方法可能会有点忙,而且我认为AutoMapper 无法将两个或多个对象映射到单一类型。

什么技术是/是克服我的担忧的首选?

4

2 回答 2

3

Automapper 将适用于您的情况。你拥有的是一个对象图,一个东西有更多的东西,Automapper 处理得很好。

于 2010-02-15T23:16:53.293 回答
1

把这些顾虑整理好...

首先,如果您担心 using 语句和存储库(我不知道是 LINQ-to-SQL 还是 LINQ-to-Entities,但没关系),我建议您做的是实现IDisposable 在您的控制器上,然后将存储库存储在模型或控制器上的字段中,或者您可以在视图中访问它的某个地方(如果您需要它,如果模型在对象为“活着”,那么你只需要在控制器的生命周期内保持它)。

然后,当请求完成时,将调用控制器上的 Dispose 方法,您可以在那里处理存储库。

就个人而言,我的基本控制器类上有一个方法,如下所示:

protected T AddDisposable<T>(T disposable) where T : class, IDisposable
{
    // Error checking.
    if (disposable == null) throw new ArgumentNullException("disposable");

    // Add to list
    ...
}

基本上,它允许您存储 IDisposable 实现,然后在控制器的 IDisposable 实现中,它遍历列表,处理所有内容。

关于实体模型上地址的曝光,我个人不认为这是一个出血问题。该地址是联系人 (IMO) 组合的一部分,因此没有它是错误

但是,如果您不希望它在那里,我不反对,因为您想一次专注于一个控制器中的一种类型,等等。

为此,您需要创建数据传输对象,这些对象基本上在您在视图模型中公开的类型和您的实体模型之间进行映射。

于 2010-02-15T23:10:07.707 回答