Dar*_*wis 11 c# asp.net asp.net-mvc entity-framework repository-pattern
我们有一个ASP.NET MVC站点,它使用Entity Framework抽象与Repository和UnitOfWork模式.我想知道的是其他人如何使用这些模式实现复杂对象图的导航.让我举一个我们的控制器的例子:
var model = new EligibilityViewModel
{
Country = person.Pathway.Country.Name,
Pathway = person.Pathway.Name,
Answers = person.Answers.ToList(),
ScoreResult = new ScoreResult(person.Score.Value),
DpaText = person.Pathway.Country.Legal.DPA.Description,
DpaQuestions = person.Pathway.Country.Legal.DPA.Questions,
Terms = person.Pathway.Country.Legal.Terms,
HowHearAboutUsOptions = person.Pathway.Referrers
};
Run Code Online (Sandbox Code Playgroud)
这是一个注册过程,几乎所有东西都悬挂在POCO类Person上.在这种情况下,我们通过注册过程缓存此人.我现在开始实现注册过程的后半部分,这需要访问对象图中更深层次的数据.特别是DPA数据在国内法律上悬挂.
上面的代码只是将模型信息映射为ViewModel的更简单格式.我的问题是你是否认为图形良好实践的这种相当深的导航,或者你是否将图形中的对象检索抽象到存储库中?
RPM*_*984 13
在我看来,这里的重要问题是 - 你禁用了LazyLoading吗?
如果你还没有做任何事情,那么它默认开启.
所以,当你这样做时Person.Pathway.Country,你将调用另一个对数据库服务器的调用(除非你正在进行急切加载,我稍后会谈到).鉴于您正在使用存储库模式 - 这是一个很大的禁忌.控制器不应导致直接调用数据库服务器.
一旦ç ontroller已收到的信息中号奥德尔,它应该是准备做投影(如有必要),并传递到V IEW,不会去回至中号奥德尔.
这就是为什么在我们的实现中(我们还使用了存储库,ef4和工作单元),我们禁用了延迟加载,并允许通过我们的服务层传递导航属性(一系列"包含"语句,变得更加甜蜜枚举和扩展方法).
然后,我们按照控制器的要求急切加载这些属性.但重要的是,Controller必须明确要求它们.
这基本上告诉用户界面 - "嘿,你只是得到关于这个实体的核心信息.如果你还想要其他任何东西,请问它".
我们还有一个服务层在控制器和存储库之间进行调解(我们的存储库返回IQueryable<T>).这允许存储库摆脱处理复杂关联的业务.急切加载是在服务层完成的(以及分页之类的事情).
服务层的好处很简单 - 更松散的耦合.存储库仅处理Add,Remove,Find(返回IQueryable),Unit of Work处理DC的"newing",以及Commiting of changes,Service层处理实体的具体化为具体集合.
这是一个很好的1-1堆栈式方法:
personService.FindSingle(1, "Addresses") // Controller calls service
|
--- Person FindSingle(int id, string[] includes) // Service Interface
|
--- return personRepository.Find().WithIncludes(includes).WithId(id); // Service calls Repository, adds on "filter" extension methods
|
--- IQueryable<T> Find() // Repository
|
-- return db.Persons; // return's IQueryable of Persons (deferred exec)
Run Code Online (Sandbox Code Playgroud)
我们还没有起床的MVC层,但(我们正在做TDD),而是一个服务层可能是你可以换个地方滋润的核心实体到的ViewModels.再一次 - 由控制器来决定它希望的信息量.
再一次,它是关于松耦合的.您的控制器应该尽可能简单,而不必担心复杂的关联.
就存储库的数量而言,这是一个备受争议的话题.有些人喜欢每个实体有一个(如果你问我就过度杀戮),有些人喜欢基于功能进行分组(在功能方面有意义,更容易使用),但是每个聚合根有一个.
我只能猜测你的模型"人"应该是我能看到的唯一聚合根.
因此,当路径始终与特定"人员"相关联时,使用另一个存储库来处理"路径"并没有多大意义.Person存储库应该处理这个问题.
再次 - 也许如果你屏幕加盖你的EDMX,我们可以给你更多的提示.
这个答案可能会根据问题的范围稍微延伸一点,但我认为我会给出一个深入的答案,因为我们正在处理这个确切的情况.
HTH.
| 归档时间: |
|
| 查看次数: |
3339 次 |
| 最近记录: |