2009-05-29 37 views
0

问候, 试图通过提供进入我的实体管理器的最佳方式进行排序,同时保持开放的背景下通过请求允许后期加载。我看到了很多类似下面的例子:访问实体管理器在ASP .NET MVC

public class SomeController 
{ 
    MyEntities entities = new MyEntities(); 
} 

我与此设置中看到的问题是,如果你有,你想拨打电话到商业类的一层,你最终不得不通过经理作为参数传递给这些方法,就像这样:

public static GetEntity(MyEntities entityManager, int id) 
{ 
     return entityManager.Series.FirstOrDefault(s => s.SeriesId == id); 
} 

很显然,我正在寻找一个良好的,线程安全的方式,为客户提供了EntityManager的方法没有传递给它。这种方式也需要单元测试,我之前尝试将它放入Session中并不适用于单元测试。

我实际上是寻找与实体框架的ASP .NET MVC处理针对企业级应用的推荐方式。

在此先感谢

回答

1

你可能想看看库模式(这里是仓库的write up用的LINQ to SQL)。

的基本想法是,与其创建一个静态类,实例化一个版本库的。您可以将EntityManager作为参数传递给构造函数中的类 - 或者更好的方法是,可以为类创建EntityManager的工厂,以便它可以执行管理器的工作单元实例化。

对于MVC,我使用了一个基础控制器类。在这个类中,您可以创建实体管理器工厂并将其作为该类的一个属性,以便派生类可以访问它。允许它从构造函数注入,但如果传入的实例为null,则使用正确的默认值创建它。每当一个控制器方法需要创建一个存储库时,它可以使用这个实例传入存储库,以便它可以创建所需的管理器。

这样,你摆脱的静态方法,并允许在单元测试中使用模拟实例。通过传入一个工厂 - 应该创建实现接口的实例,顺便说一句 - 你将你的存储库与实际的管理器类分离开来。

2

实体框架1.0在Windows擅长窗体应用程序,你可以使用对象范围内,只要你喜欢。尤其是在asp.net和mvc中,它有点难度。我的解决方案是让存储库或实体管理器更像MVC可以与之通信的服务。我创造了一种generic all purpose base repository我可以使用,只要我觉得喜欢它,只是停止打扰太多做正确的。我会尽量避免将对象上下文保持打开状态,甚至比Web应用程序中绝对需要的更长的时间。

看看EF4。我开始在生产环境中使用EF,当时它处于beta 0.75或类似的状态,除了它有时是“辛勤工作”之外,没有真正的问题。

0

不要在视图中延迟加载实体。不要在视图中进行业务层调用。在控制器中加载视图需要的所有实体,计算所有的总和和视图在控制器中需要的平均值,等等。毕竟,这就是控制器的用途。

+0

我不知道的人,这似乎是一个可怕的很多重复的代码,特别是如果你有管理员和匿名的部分。我觉得更好的把Get *代码集中到一个中心位置,因为我需要改变我把它带回来的方式。如果您只在一个地方完成聚合逻辑,我同意您的意见 – xximjasonxx 2009-05-29 14:11:55

+0

使用自动映射器(http://www.codeplex.com/AutoMapper)将您需要的域的各个部分映射到您发送的DTO中的属性到视图。 – yfeldblum 2009-05-29 23:07:35