我正在开发一个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,依此类推。我已经看到了几个实现,其中返回关系的多个/依赖方而没有对其父对象的引用,这消除了问题,但是如果可能的话我想保留该链接。
鉴于这是一个如此香草的安排,我怀疑我完全忽略了某点。把它放在一起的正确方法是什么?
答案 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(BarModel
,Foo
),则可以使数据特定的DAO(Bar
,{{1}})正常工作(尽管如果您正在使用ORM框架,则很少需要它们),但是它们应该是数据层的内部,而不需要在业务逻辑中进行这些映射。