我花了一些时间来解决一个问题,但到目前为止还没有解决方案。我有一个预定义的非常庞大的数据库,其结构是固定的。我使用仓库模式在服务代码和数据库逻辑之间创建抽象层。问题是,在将对象从仓库传递出去之前,我需要对数据库对象进行一些处理。因此,我不能直接使用 Linq 实体。
基本上,仓库方法看起来像这样:
public IList<Bookingcode> FindBookingcode(int id) {
return (from b in _db.BOOKINGCODE
where b.ID == id
select new Bookingcode {
Id = b.ID,
Name = b.NAME.Trim()
}).ToList();
}
目前为止,这个很好用。但是我有很多对象需要单独组合。FindBookingcode() 应该返回一个几乎完整的对象,包括其他对象,如目录等。我的问题现在是,我必须像这个例子中一样多次重写映射:
public IList<Bookingcode> FindBookingcode(int id) {
return (from b in _db.BOOKINGCODE
join c1 in _db.CATALOG on b.CATALOGID equals c1.ID
where b.ID == id
let refs = (
from bc1 in _db.BOOKINGCODE
join p in _db.PACKAGE on bc1.ID equals p.BOOKINGCODE
join bc2 in _db.BOOKINGCODE on p.PACKAGEREF equals bc2.ID
join c in _db.CATALOG on bc.CATALOGID on bc2.CATALOGID equals c.ID
where bc1.ID == b.ID
select new PackageInfo {
ID = p.ID
BookingcodeRef = new Bookingcode {
ID = bc2.ID,
Catalog = new Catalog { ID = c.ID }
}
})
select new Bookingcode {
ID = b.ID,
PackageInfo = refs.ToList()
}).ToList();
}
我还在代码库中进行了一些L2O处理,以组装返回的对象。另一个我没有很好的解决方案的问题是如何告诉代码库应该获取什么,比如FindBookingcode(id, includePackageInfo, includeCatalog)。
那么这里有几个问题:
1)这种方法是否完全愚蠢?
2)你能指导我找到一个使重映射更简单的解决方案吗?
3)如何实现DDD的标准机制?