工厂模式循环依赖

时间:2014-05-07 20:01:55

标签: c# asp.net factory-pattern

我正在开发一个Web API 2.0项目,并怀疑我正在做一些与ModelFactory类有关的错误。

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

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创建Bars,后者创建后续Foos,依此类推。我已经看到了几个实现,其中返回关系的多个/依赖方而没有对其父对象的引用,这消除了问题,但是如果可能的话我想保留该链接。

鉴于这是一个如此香草的安排,我怀疑我完全忽略了某点。把它放在一起的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您是否创建了没有父BarModel的{​​{1}}?我想到的第一件事就是只需要将父FooModel传递到FooModel BarModel方法:

Create

在旁注中,DAL-Entities依赖关系的通常方向是在您的域模型中声明您的实体(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 }; } } FooModel),让DAL知道它们并返回实例这些实际的实体。如果需要数据特定的DAO(BarModelFoo),则可以使数据特定的DAO(Bar,{{1}})正常工作(尽管如果您正在使用ORM框架,则很少需要它们),但是它们应该是数据层的内部,而不需要在业务逻辑中进行这些映射。