我正在从事一个WebAPI2.0项目,并且怀疑我对ModelFactory类做了一些非常错误的事情。
我正在尝试实现工厂“创建”方法,用于构造和返回数据层实体的净化模型。当我将实体(Foo)的创建方法(Foo)组合在一起时,我遇到了一些困难--这是一组依赖实体(Bar)的一对多关系的主体。我希望消费客户端应用程序能够使用返回的模型对象从Foo导航到它的条形图集合,并从给定的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创建条,这会创建后续Foos,等等。我已经看到了一些实现,其中返回关系的许多/依赖方而不引用它的父对象,这消除了问题,但如果可能的话,我希望保留这个链接。
考虑到这是一种无趣的安排,我怀疑我在某个地方完全忽略了这一点。有什么正确的方法把这些组合在一起?
发布于 2014-05-07 21:30:36
您是否创建过没有父BarModel的FooModel?我想到的第一件事就是只需要将父FooModel传递到BarModel Create方法:
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实体依赖的通常方向是在域模型中声明实体(FooModel,BarModel),并让DAL知道它们并返回这些实际实体的实例。如果需要特定于数据的do (Foo、Bar)才能正常工作(虽然如果您使用ORM框架很少需要它们),那么它们应该是数据层内部的,而不需要在业务逻辑中执行这些映射。
https://stackoverflow.com/questions/23527275
复制相似问题