Dev*_*evT 14 .net c# design-patterns dto
对不起,我是企业应用程序的新手以及设计模式.可能是这个问题缺乏对设计模式的了解.我发现使用DTO传输数据更好.
我的业务实体类如下:
public class Patient
{
public string ID { get; set; }
public string FullName { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以在我的应用程序中,用户只能提供ID和HospitalID.所以它需要另一个Web服务并获取人员信息
public class PersonDTO
{
public string NIC { get; set; }
public string FullName { get; set; }
public string FirstName { get; set; }
public string BirthPlace { get; set; }
public string BirthCertificateID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以根据这些信息我去了Patient对象.(使用DTO模式)
所以我想写一个新类来转换如下.
public class PatientDO
{
public static Patient ConvertToEntity(
PatientRegistrationDTO pregDTO,
PersonDTO person
)
{
Patient p = new Patient();
p.NIC = pregDTO.NIC;
p.FullName = person.FullName;
p.FirstName = person.FirstName;
return p;
}
}
Run Code Online (Sandbox Code Playgroud)
但最近我读了很少的文章,他们使用Serializer Helper class以及XmlSerializer我无法理解为什么他们使用这样的东西.
对于DTO模式,需要使用XmlSerializer以及为什么使用它?
Pau*_*lor 20
你应该看看AutoMapper.
这是一个软件,您可以将其包含在您的解决方案中,该软件会自动将值从一个类映射到另一个类.
它会自动映射具有相同名称的属性,并且在涉及子对象时也非常智能.但是,它还可在您需要时提供完整的映射控制.
编辑
几个示例来说明AutoMapper的工作原理.请注意我在现实生活中从不编码.简洁!
示例类.
// Common scenario. Entity classes that have a connection to the DB.
namespace Entities
{
public class Manager
{
public virtual int Id { get; set; }
public virtual User User { get; set; }
public virtual IList<User> Serfs { get; set; }
}
public class User
{
public virtual int Id { get; set; }
public virtual string Firstname { get; set; }
public virtual string Lastname { get; set; }
}
}
// Model class - bit more flattened
namespace Models
{
public class Manager
{
public int Id { get; set; }
public string UserFirstname { get; set; }
public string UserLastname { get; set; }
public string UserMiddlename { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
通常,您可以使用项目的一部分来配置所有AutoMapping.通过我刚刚给出的示例,您可以在Entities.Manager和Models.Manager之间配置映射,如下所示: -
// Tell AutoMapper that this conversion is possible
Mapper.CreateMap<Entities.Manager, Models.Manager>();
Run Code Online (Sandbox Code Playgroud)
然后,在您的代码中,您将使用类似的东西从Entity版本获取新的Models.Manager对象.
// Map the class
var mgr = Map<Entities.Manager, Models.Manager>
( repoManager, new Models.Manager() );
Run Code Online (Sandbox Code Playgroud)
顺便提一下,如果你一致地命名,AM足够聪明,可以自动解决很多属性.
上面的示例,应自动填充UserFirstname和UserLastname,因为: -
但是,在Entities.Manager和Models.Manager之间进行映射后,Models.Manager中的UserMiddlename属性将始终为空,因为User没有名为Middlename的公共属性.
| 归档时间: |
|
| 查看次数: |
46312 次 |
| 最近记录: |