通过“视图”界面公开对象

时间:2013-01-24 14:34:47

标签: c#

我一直试图找到一种灵活的方式来通过视图来展示对象。我可能最好通过举例的方式解释。

我有一个Entity Framework实体模型,以及一个可用于查询它的Web服务。我能够返回实体类本身,但是这将包括我可能不想共享的一些字段 - 例如ID,或实体模型中任何关联的* Reference属性。

我认为我需要的是数据视图,但我并不特别想为每种返回类型编写视图包装类。我希望我能够定义一个界面并以某种方式利用它。例如:

interface IPersonView
{
     string FirstName { get; }
     string LastName { get; }
}

-

// (Web service method)
IPersonView GetPerson(int id)
{
    var personEntity = [...];
    return GetView<IPersonView>(personEntity);
}

但是,为了做这样的事情,我必须让我的实体实现视图接口。我希望有一个更灵活的鸭子型。方法,因为可能有很多对象的观点,我真的不想全部实现它们。

我通过反映界面和复制字段和属性来构建动态类型取得了一些成功,但是我无法将其强制转换回接口类型以便在网络服务。

只是寻找一些意见和建议,欢迎两者。感谢。

2 个答案:

答案 0 :(得分:3)

您不应该将实体直接传递给客户端,它们应该仅用于持久性。您应该根据API要返回的任何数据引入DTOs/POCOs,例如。

public class PersonDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

// public API method
public PersonDto GetPersonApi(int id)
{
    var personEntity = // pull entity from db
    return new PersonDto()
    {
        FirstName = personEntity.FirstName,
        LastName = personEntity.LastName
    };
}

这使您的持久层和&amp;之间保持清晰的分离。公共界面。您可以使用AutoMapper之类的工具在映射数据方面做好工作。只需设置一次映射,例如在你的全球asax:

protected void Application_Start()
{
    Mapper.CreateMap<Person, PersonDto>();
}
...
// public API method
public PersonDto GetPersonApi(int id)
{
    var personEntity = // pull entity from db
    return Mapper.Map<Person, PersonDto>(personEntity);
}

答案 1 :(得分:1)

我通常会使用AutoMapper或类似工具看到这一点。它使类似类之间的映射更加简单。您仍然需要创建Views(在MVC上下文中将是Model),但只要您使用相同的部分(映射)就会为您完成字段名称。

作为旁注,如果您想更新数据,则需要共享ID和其他参考数据,因为您需要知道密钥才能知道哪些记录更新。