c#函数有条件地返回不同的模型 - 存储库模式

问题描述 投票:0回答:2

我在.NET MVC项目中使用存储库模式,我需要使用相同的函数来获取数据,但是在两个不同的结构中(有条件地)。

更具体地说,有些情况下我需要获取具有一堆属性的模型的完整版本,但是在某些情况下我需要获取模型的节俭版本(主要是出于安全原因)。

到目前为止的代码:

public async Task<IEnumerable<AnswerMinimalDto>> GetQuestionsForUser(int userId)
{
    IEnumerable<Answer> foundAnswers = await this.repository.getAnswersByUser(userId);

    return Mapper.Map<IEnumerable<AnswerMinimalDto>>(foundAnswers);
}

所以映射应该有条件地发生:

....return Mapper.Map<IEnumerable<AnswerMinimalDto>>(foundAnswers);

要么

....return Mapper.Map<IEnumerable<AnswerFullDto>>(foundAnswers);

这里我们有两个面向对象的原则冲突。首先想到的是有两种不同的方法来满足单一责任原则。另一方面,通过使用两种不同的方法完成相同的工作是重复。

我将采用单一方法的方法。到目前为止我尝试过的方法是使用Tuples返回两个模型并处理控制器所需的结果(因为我的方法是异步的,因此无法应用)。但我对这种方法并不满意。

到目前为止,我想知道是否有任何优雅/可取的方式来返回有条件地选择的不同结构中的数据。

欢迎任何帮助。

c# asp.net-mvc repository-pattern
2个回答
1
投票

您可以使用泛型来解决这个问题:

public async Task<IEnumerable<T>> GetQuestionsForUser<T>(int userId)
{
    IEnumerable<Answer> foundAnswers = await this.repository.getAnswersByUser(userId);

    return Mapper.Map<IEnumerable<T>>(foundAnswers);
}

IEnumerable<AnswerMinimalDto> a = await GetQuestionsForUser<AnswerMinimalDto>(foundAnswers);
IEnumerable<AnswerFullDto> b = await GetQuestionsForUser<AnswerFullDto>(foundAnswers);

虽然我同意很多trailmax says on this TBH

IMO DTO对象和Automapper是代码味道/反模式。为什么不直接返回底层对象?


2
投票

有两种不同的方法做同样的工作是重复

但他们没有做同样的工作!一个给你更多数据,另一个给你更少的数据。在我看来,这是两件不同的事情。

同时试图让控制器决定向客户呈现什么是一种气味 - 业务逻辑被拼写到控制器。

正如您所说 - 您可以使用两种方法来提供不同的数据。但我会更进一步,并隔离接口:一个接口,两个实现。 IRepositoryFullRepositoryImplFrugalRepositoryImpl

让你的DI决定当前需要哪一个,因为我敢打赌,这不是你需要提供一组有限数据的单一事件。

© www.soinside.com 2019 - 2024. All rights reserved.