【问题标题】:Is there any way to provide custom factory for .Net Framework creation Entities from EF4?有没有办法从 EF4 为 .Net Framework 创建实体提供自定义工厂?
【发布时间】:2010-05-11 01:54:45
【问题描述】:

有很多关于 POCO 对象有多酷以及 Entity Framework 4 如何支持它们的帖子。 我决定尝试使用面向领域驱动开发的架构,并完成与服务有依赖关系的领域实体。 到现在为止还挺好。 想象一下我的产品是 POCO 对象。 当我查询这样的对象时:

NorthwindContext db = new NorthwindContext();
var products = db.Products.ToList();

EF 为我创建产品实例。

现在我想在我的 POCO 对象(产品)中注入依赖项 我看到的唯一方法是在 NorthwindContext 中创建一些方法,使其类似于下面的伪代码:

public List<Product> GetProducts(){
    var products = database.Products.ToList();
    container.BuildUp(products); //inject dependencies
    return products;
}

但是如果我想让我的存储库像这样更灵活怎么办:

public ObjectSet<Product> GetProducts() { ... }

所以,我真的需要一个工厂来使它更懒惰和对 linq 更友好。 请帮忙!

【问题讨论】:

    标签: .net domain-driven-design poco factory entity-framework-4


    【解决方案1】:

    您在寻找yield 关键字吗?

    public IEnumerable<Product> GetProducts()
    {
        foreach(var product in database.Products)
        {
            yield return container.BuildUp(product);
        }
    }
    

    -- 第二次尝试:

    public IEnumerable<Product> BuildUp(this IEnumerable<Product> source)
    {
        foreach(var product in source)
        {
            yield return container.BuildUp(product);
        }
    }
    

    用法:

    database.Products.Where(p => blah).BuildUp();
    

    【讨论】:

    • 感谢您的变体!好吧,想象一下我有 1000 个产品,其中至少有一半将在简单查询 database.Products.Where(x => x.Id == 50); 上加载到内存中。我应该告别 .Include(...) 查询语法
    • 我已经更新了答案,这应该可以减少不必要的负载
    • :) 好的,它对我有用。因此,如果此版本的 EF 中不存在此类工厂 - 我会认为此答案已被接受。谢谢万贾!
    【解决方案2】:

    答案是您不应该将服务注入您的实体。这个答案背后的原因可以在Jimmy Bogard's blogon my own one 上找到。

    有很多问题,包括:

    • 对使用注入依赖项的方法感到困惑
    • 实体和服务的不同生命周期
    • 测试困难

    【讨论】:

    • 感谢 Szymon 看我的帖子!我只是开始以领域设计的方式创建架构,在此之前我最好使用我的意图。现在我有机会在我的创作中引入某种概念,正确命名和组织事物等等。依赖关系的问题主要在于设计中的imo,它使实体负责概念上不同的事情。我们都从实体中删除了持久性逻辑,因为这不是实体本身的目的,对吧?那么,为什么不只留下同构逻辑呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多