【发布时间】:2015-07-23 06:56:27
【问题描述】:
我有一个 WCF 服务,它通过 net.tcp 通过 EntityFramework 与 SQL 一起工作
允许客户端通过 Id 从 Db 中查询项目。
我有很多这样的方法:
public SiteDTO GetSiteById(long siteId)
{
using (var context = new MyDbContext())
{
var site = context.Site.Find(siteId);
return AutoMapper.Mapper.Map<SiteDTO>(site);
}
}
所以我决定用一种方法来统治他们:
public TDTO GetEntityById<TDTO, TSet>(object id)
where TDTO : class
where TSet : class
{
using (var context = new MyDbContext())
{
var entity = context.Set<TSet>().Find(id);
if (entity == null)
return default(TDTO);
return AutoMapper.Mapper.Map<TSet, TDTO>(entity);
}
}
但问题是应该使用它的客户端对TSet 类型一无所知(它是一种数据库类型,客户端仅适用于DTO),因此不能以这种方式调用此方法。我需要这样做:
public TDTO GetEntityById<TDTO>(object id)
where TDTO : class
{
using (var context = new MyDbContext())
{
//Something like this and a lot of reflection...
Type setType = Resolver(typeof(TDTO));
//I know this won't work. Just to show my intentions
var entity = context.Set<setType>().Find(id);
if (entity == null)
return default(TDTO);
return AutoMapper.Mapper.Map<setType, TDTO>(entity);
}
}
我知道如何以稳健的方式解决问题 - 让 Dictionary<Type,Type> 注册一次并使用它。
问题: 有没有更优雅的方式(可能使用 AutoMapper 方法)来做到这一点?
【问题讨论】:
-
我认为
GetEntityById<T,P>不应该暴露给客户端,它应该是一个私有方法并由 wcf 服务调用。实体和DTO的关系比较复杂,如果客户端直接调用gernic方法,可能无法适应未来的变化
标签: c# entity-framework generics automapper parametric-namespaces