繁体   English   中英

重构 C# 代码以实现某种工厂设计模式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM