我想问一些有关映射类型和在C#中使用扩展方法的最佳实践的问题。我知道这个主题在过去几年中已被讨论过多次,但是我读了很多帖子,但仍然有疑问。
我遇到的问题是扩展具有“转换”功能的类。假设我有“ Person”类,该类表示将由某些逻辑使用的对象。我还有一个“客户”类,代表来自外部API的响应(实际上会有多个API,因此我需要将每个API的响应映射到常见类型:Person)。我可以访问两个类的源代码,并且理论上可以在那里实现我自己的方法。我需要将客户转换为人,以便可以将其保存到数据库。该项目不使用任何自动映射器。
我有4种可能的解决方案:
Consumer类中的.ToPerson()方法。这很简单,但是对我来说似乎是在打破“单一责任”模式,尤其是Consumer类也映射到其他类(某些其他外部API要求),因此它需要包含多种映射方法。
Person类中的构造函数,以Consumer为参数。也很容易,似乎也打破了单一责任模式。我需要有多个映射构造函数(因为将有另一个API的类,提供与Consumer相同的数据,但格式略有不同)
具有扩展方法的Converters类。这样,我可以为Consumer类编写.ToPerson()方法,并且当另一个API与其自身的NewConsumer类一起引入时,我可以编写另一个扩展方法并将其全部保存在同一文件中。我听过一种意见,即扩展方法通常是邪恶的,仅在绝对必要时才应使用扩展方法,这就是使我受挫的原因。否则我喜欢这个解决方案
转换器/映射器类。我创建了单独的类来处理转换并实现将源类实例作为参数并返回目标类实例的方法。
综上所述,我的问题可以简化为问题的数量(全部与我上面所述的内容相关):
是否将转换方法放入(POCO?)对象中(例如Consumer类中的.ToPerson()方法)是否被视为打破单一责任模式?
在(DTO类)类中使用转换构造函数是否被视为打破单一责任模式?尤其是如果可以从多种源类型转换此类,那么是否需要多个转换构造函数?
在访问原始类源代码的同时使用扩展方法是否被视为不良做法?这样的行为可以用作分隔逻辑的可行模式吗?还是反模式?
Person
课程是DTO吗?它包含任何行为吗?