【发布时间】:2018-12-11 23:16:58
【问题描述】:
最近我创建了一个服务,它在我的 API 中为 GET 端点提供了一些逻辑(返回某个数据库表的所有值)。
为此创建服务的原因是我想在某一时刻修改 GET 逻辑,而不是将来必须在所有端点上更改它。
我创建了一个可以工作的测试服务,但是因为我有超过 50 个表(DTO 类),所以我想让服务更通用。
我现在已经实现了以下,这只是一个带有一个 DTO 类的 GET 操作的示例:
public interface IOMSService
{
IEnumerable<CommodityViewModel> GetAll(); // Can I use <T> for this? - now I need to make interface properties for every OMS class (50+)
}
public class OMSService : IOMSService
{
private MyDBContext _context;
private IMapper _mapper;
public OMSService(MyDBContext context, IMapper mapper)
{
_context = context;
_mapper = mapper;
}
public IEnumerable<CommodityViewModel> GetAll() // How to make this more generic?
{
var result = this._context.Commodity
.Include(i => i.OmsCommodityMaterial);
var CommodityVM = _mapper.Map<IList<CommodityViewModel>>(result);
return CommodityVM;
}
}
上面的示例有效,但是,这意味着我需要为每个 DTO 类实现超过 50 个接口属性和 50 个GetAll 实现(因此与在端点本身中更改它相比,这不是一种改进)。
有没有办法让它更通用?
我认为接口中IEnumerable 的DTO 部分和GetAll 函数应该是通用类型(这样我就可以在端点本身提供正确的ViewModel / DTO)。
我已经想出了这样的东西:
public interface IOMSService<T, U>
where T : IEnumerable<U>
{
T GetAll { get; }
}
有人能指出我正确的方向吗?
【问题讨论】:
-
好问题,我想看看这个问题的答案。就这个问题向我 +1。
-
Is there a way to make this more generic?。简短回答:是的 -
实体框架和 LINQ-to-Entities 已经这样做了。
-
顺便说一句,此代码会将整个
Commodity表加载到内存中,以便将其映射到CommodityViewModel而不进行任何过滤。 -
@PanagiotisKanavos 好吧,它叫
GetAll:)
标签: c# asp.net-core