[英]Refactor over C# code to implement some kind of Factory Design Pattern
我有一个 Web API 应用程序 (.NET Core),它是我后端的一部分。 我已经将工作单元和存储库模式实现到 N 层 1 层架构中。 客户端应用程序和后端通信的方式是通过发送 DTO(数据传输对象)。 因此,根据存储库方法的请求,我显然有不同的 DTO,具有不同的结构和组成。 这是因为在设计时我定义了客户端期望的 DTO 类型,如下所示:
public EmployeeDto GetEMployeeDto()
{
public EmployeeDto employee = new EmployeeDto();
.
.
.
// Code to get data from data base and full fill the fields of the DTO.
.
.
.
return EmployeeDto;
}
EmployeeDto
是这样的:
public cladd EmployeeDto()
{
public int Employee Id {get;set;}
public string EmployeeName {get;set;}
}
我想要做的是删除紧密耦合的实例化代码( public EmployeeDto employee = new EmployeDto();
),并实现某种工厂模式,我只调用 Factory 对象,传递我想要的 DTO 类型(因为我已经知道了)并且工厂将我请求的 DTO 类型和 DTO 状态(数据)返回给我。
请记住,我有几种具有不同结构的 DTO,因此它们的填充方式不同,并且可以在不同的方法中调用 Factory 对象并可以请求不同的 DTO。
就像是:
var employee = FactoryDto.GetDto(EmployeDto);
var employeeHistory = FactoryDto.GetDto(EmployeeHistoryDto);
只需一行即可获取整个“包”DTO 本身和数据。
我只需要指导哪些设计模式可能是最佳选择和一个示例,我已经阅读了有关 Creational Design 模式工厂及其不同风格的内容,但我还不明白这是如何实现的。
这是我的方法之一:
public EmployeeDto GetEmployeeDto(string dtoType)
{
var factoryDto = new FactoryDto();
var empDto = factoryDto.GetDto(dtoType);
return (EmployeeDto)empDto;
}
public class FactoryDto
{
public object GetDto(string dtoType)
{
switch(dtoType)
{
case "EmployeeDto":
{
return new EmployeeDto();
}
case "EmployeeHistoryDto":
{
return new EmployeeHistoryDto();
}
default:
{
return new EmployeeHistoryDto();
}
}
}
}
但是,我不认为这是一个正确的答案,在返回 Dto 时强制转换 Dto,我不喜欢 Factory 类中的 Object 泛型类型。 有没有更好的方法来使用任何创建设计模式来改进这种方法? 问候!
没有办法(至少对我来说没有意义)将旨在处理特定类型的实现与这种类型分离。 处理EmployeeDto
类型的存储库直接了解这种类型似乎是很自然的。
不确定您的设计如何看待更广阔的视野,但也许您缺少的是通用接口,因此您的客户端没有太多耦合? 例如,这样的事情:
public interface IRepository<T>
{
IEnumerable<T> GetAll<T>();
T Get<T>(int id);
}
这意味着您不会像示例中那样使用GetEmployeeDto
方法,而只是通用的GetDto
甚至Get
。 这让我想到另一个提示:遵循 DDD 相关模式,存储库应该返回一个可以使用的域对象,而不是 DTO。
这样你的领域层就可以只使用存储库并专注于领域逻辑,而不是被迫处理转换。 正如评论中提到的,无论如何配置一个自动映射库来为你做这件事是很好的。 但即使使用自动映射器,所有技术细节都应该对域层隐藏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.