c# - LINQ、存储库模式和数据库抽象

标签 c# asp.net-mvc linq repository-pattern

我现在已经花了一些时间来解决一个问题,直到现在我还没有解决方案。我有一个预定义的非常庞大的数据库,其结构是固定的。我使用存储库模式在服务代码和数据库逻辑之间创建一个抽象层。问题是,在将它们从存储库中传递出去之前,我需要对数据库对象应用一些处理。因此我不能直接使用 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的标准机制如何实现

最佳答案

在我的存储库中,我有一个单独的构建方法,它接受 LINQ to SQL 实体并返回一个业务对象。

构建方法看起来像(this.Container 是一个 Unity IoC 容器,对于示例来说并不重要):

private IGroup BuildGroup(Entities.Group group)
{
    IGroup result = this.Container.Resolve<IGroup>();
    result.ID = group.GroupID;
    result.Name = group.Name;

    return result;
}

然后每个方法使用build方法返回一个业务对象:

public override IGroup GetByID(int id)
{
    try
    {
        return (from g in this.Context.Groups
                where g.GroupID == id && g.ActiveFlag
                select this.BuildGroup(g)).Single();
    }
    catch (InvalidOperationException)
    {
        return null;
    }
}

这通过从数据库中取回每个 LINQ to SQL 实体并通过构建方法运行它来实现,因此在这种情况下您的结果将是您的业务对象的可枚举而不是 LINQ to SQL 实体。

关于c# - LINQ、存储库模式和数据库抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049867/

相关文章:

c# - base64 编码 HttpPostedFileBase

c# - 通过 LINQ 加载嵌套属性

c# - 在 LINQ 中,orderby() 是只执行一次比较函数还是在需要时执行它?

c# - 返回由 Image.FromStream(Stream stream) 方法创建的图像

c# - 如果值已更改 C#,则将参数从文本框发送到存储过程

c# - 私有(private)访问与公共(public)访问

c# - 使用键名从 ModelState 获取值

asp.net-mvc - ASP.NET MVC - 多态域类和 View 模型

c# - LINQ, "Argument types do not match"错误,这是什么意思,我该如何解决?

c# - 举办锦标赛,如何存储所有玩家分数