首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工厂模式循环依赖

工厂模式循环依赖
EN

Stack Overflow用户
提问于 2014-05-07 20:01:54
回答 1查看 628关注 0票数 0

我正在从事一个WebAPI2.0项目,并且怀疑我对ModelFactory类做了一些非常错误的事情。

我正在尝试实现工厂“创建”方法,用于构造和返回数据层实体的净化模型。当我将实体(Foo)的创建方法(Foo)组合在一起时,我遇到了一些困难--这是一组依赖实体(Bar)的一对多关系的主体。我希望消费客户端应用程序能够使用返回的模型对象从Foo导航到它的条形图集合,并从给定的Bar导航到它的父Foo。这种关系的双方似乎都需要建立以下模型:

代码语言:javascript
运行
复制
public class ModelFactory
{
    public FooModel Create(Foo foo)
    {
        return new FooModel()
        {
            FooProperty1 = foo.FooProperty1,
            FooProperty2 = foo.FooProperty2,
            ...,
            Bars = foo.Bars.Select(b => Create(b)).ToList()
        };
    }

    public BarModel Create(Bar bar)
    {
        return new BarModel()
        {
            BarProperty1 = bar.Property1,
            BarProperty2 = bar.Property2,
            ...,
            Foo = Create(bar.Foo)
        };
    }
}

不幸的是,这会导致无限循环,Foo创建条,这会创建后续Foos,等等。我已经看到了一些实现,其中返回关系的许多/依赖方而不引用它的父对象,这消除了问题,但如果可能的话,我希望保留这个链接。

考虑到这是一种无趣的安排,我怀疑我在某个地方完全忽略了这一点。有什么正确的方法把这些组合在一起?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-07 21:30:36

您是否创建过没有父BarModelFooModel?我想到的第一件事就是只需要将父FooModel传递到BarModel Create方法:

代码语言:javascript
运行
复制
public class ModelFactory
{
    public FooModel Create(Foo foo)
    {
        var fooModel = new FooModel()
        { ... };

        // pass this model instance to the Create method
        fooModel.Bars = foo.Bars
              .Select(b => Create(b, fooModel))
              .ToList();

        return fooModel;
    }

    // how about making this private?
    // can a Bar exist without a Foo parent?
    private BarModel Create(Bar bar, FooModel parentModel)
    {
        return new BarModel()
        {
            // we don't create a new model here
            Foo = parentModel
        };
    }
}

另外,DAL实体依赖的通常方向是在域模型中声明实体(FooModelBarModel),并让DAL知道它们并返回这些实际实体的实例。如果需要特定于数据的do (FooBar)才能正常工作(虽然如果您使用ORM框架很少需要它们),那么它们应该是数据层内部的,而不需要在业务逻辑中执行这些映射。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23527275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档