我一直试图找到一种灵活的方式来通过视图来展示对象。我可能最好通过举例的方式解释。
我有一个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);
}
但是,为了做这样的事情,我必须让我的实体实现视图接口。我希望有一个更灵活的鸭子型。方法,因为可能有很多对象的观点,我真的不想全部实现它们。
我通过反映界面和复制字段和属性来构建动态类型取得了一些成功,但是我无法将其强制转换回接口类型以便在网络服务。
只是寻找一些意见和建议,欢迎两者。感谢。
答案 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和其他参考数据,因为您需要知道密钥才能知道哪些记录更新。