Asp.net mvc 在ASP.NETMVC中访问实体管理器
您好, 尝试通过最佳方式进行排序,以提供对我的实体管理器的访问,同时通过请求保持上下文打开,以允许延迟加载。我看到很多这样的例子:Asp.net mvc 在ASP.NETMVC中访问实体管理器,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,您好, 尝试通过最佳方式进行排序,以提供对我的实体管理器的访问,同时通过请求保持上下文打开,以允许延迟加载。我看到很多这样的例子: public class SomeController { MyEntities entities = new MyEntities(); } 我看到的这个设置的问题是,如果您有一层要调用的业务类,那么最终必须将管理器作为参数传递给这些方法,如下所示: public static GetEntity(MyEntities entityManager, i
public class SomeController
{
MyEntities entities = new MyEntities();
}
我看到的这个设置的问题是,如果您有一层要调用的业务类,那么最终必须将管理器作为参数传递给这些方法,如下所示:
public static GetEntity(MyEntities entityManager, int id)
{
return entityManager.Series.FirstOrDefault(s => s.SeriesId == id);
}
显然,我正在寻找一种好的线程安全的方法,为方法提供entityManager而不传递它。该方法还需要是单元测试的,我以前尝试将其置于会话中,但对单元测试不起作用
实际上,我正在寻找一种推荐的方法来处理企业级应用程序ASP.NETMVC中的实体框架
提前感谢Entity Framework v1.0在Windows窗体应用程序中表现出色,您可以在其中随意使用对象上下文。特别是在asp.net和mvc中,这有点困难。我的解决方案是使存储库或实体管理器更像MVC可以与之通信的服务。我创造了一种我可以在任何时候使用的方法,只是不再为做对而烦恼太多。我会尽量避免让对象上下文保持打开状态的时间比web应用程序中绝对需要的时间长一毫秒
看看EF4。我是在beta 0.75或类似版本的生产环境中开始使用EF的,除了有时会“费力”之外,它没有任何实际问题。Entity Framework v1.0在Windows窗体应用程序中表现出色,在这些应用程序中,您可以随心所欲地使用对象上下文。特别是在asp.net和mvc中,这有点困难。我的解决方案是使存储库或实体管理器更像MVC可以与之通信的服务。我创造了一种我可以在任何时候使用的方法,只是不再为做对而烦恼太多。我会尽量避免让对象上下文保持打开状态的时间比web应用程序中绝对需要的时间长一毫秒
看看EF4。我开始在生产环境中使用EF是在beta 0.75或类似版本中,除了有时是“繁重的工作”之外,它没有任何实际问题。不要在视图中延迟加载实体。不要在视图中进行业务层调用。在控制器中预先加载视图需要的所有实体,计算视图在控制器中预先需要的所有总和和平均值,等等。毕竟,这就是控制器的用途。不要延迟加载视图中的实体。不要在视图中进行业务层调用。在控制器中预先加载视图需要的所有实体,计算视图在控制器中预先需要的所有总和和平均值,等等。毕竟,这就是控制器的用途。您可能需要查看存储库模式(这里是一个包含Linq到SQL的存储库的示例) 基本思想是,不要创建静态类,而是实例化存储库的一个版本。您可以将EntityManager作为参数传递给构造函数中的类——或者更好的是,传递一个工厂,该工厂可以为类创建EntityManager,以便它可以执行管理器的工作单元实例化 对于MVC,我使用一个基本控制器类。在这个类中,您可以创建实体管理器工厂,并将其作为类的属性,以便派生类可以访问它。允许从构造函数注入,但如果传入的实例为null,则使用适当的默认值创建。每当控制器方法需要创建存储库时,它都可以使用此实例传递到存储库中,以便创建所需的管理器
这样,您就摆脱了静态方法,并允许在单元测试中使用模拟实例。通过传入一个工厂(该工厂应该创建实现接口的实例,顺便说一句),您可以将存储库与实际的manager类解耦。您可能需要查看存储库模式(这里是一个包含Linq到SQL的存储库) 基本思想是,不要创建静态类,而是实例化存储库的一个版本。您可以将EntityManager作为参数传递给构造函数中的类——或者更好的是,传递一个工厂,该工厂可以为类创建EntityManager,以便它可以执行管理器的工作单元实例化 对于MVC,我使用一个基本控制器类。在这个类中,您可以创建实体管理器工厂,并将其作为类的属性,以便派生类可以访问它。允许从构造函数注入,但如果传入的实例为null,则使用适当的默认值创建。每当控制器方法需要创建存储库时,它都可以使用此实例传递到存储库中,以便创建所需的管理器
这样,您就摆脱了静态方法,并允许在单元测试中使用模拟实例。通过传入一个工厂——该工厂应该创建实现接口的实例,顺便说一句——您将存储库与实际的manager类分离。我不知道,伙计,这似乎有很多重复的代码,特别是如果您有管理和匿名部分。我会觉得把Get*代码集中到一个中心位置会更好,因为我需要改变把它带回来的方式。我同意你关于聚合逻辑的观点,如果你只在一个地方使用automapper()将你需要的域的部分映射到你发送到视图的DTO中的属性。我不知道,伙计,这似乎有很多重复的代码,特别是如果你有管理和匿名部分。我会觉得把Get*代码集中到一个中心位置会更好,因为我需要改变把它带回来的方式。在聚合逻辑方面,我同意你的观点,如果你只在一个地方使用automapper()来映射域中