我有一个用普通ASP.NET编写的应用程序,我想移植到ASP.NET MVC。
然而,我对持久化对象的正确位置感到困惑。我需要坚持几个理由:
通常,我会说#1将作为静态项保存在Globals.asax中,可以使用Global.Repository或类似的方式命中。
我通常会说#2应该是一个属性,在页面的基类中某个地方有一个会话备份存储。
现在我感到困惑的原因是,我听说MVC中的会话已经发生了变化,而且Global.asax不再拥有相同的类。此外,页面的概念已经被删除,因此向控制器的基类添加一个属性似乎.不对。
你们说什么?
发布于 2009-05-27 12:50:32
您的数据库将进入控制器的基类。这个基类应该扩展Controller,所有控制器都应该扩展这个基类。下面是一个小小的例子:
public class BaseController : Controller
{
private AuthServices _auth;
private LogHelper _log;
private Repository _repository;
/// <summary>
/// <see cref="AuthServices"/>
/// </summary>
protected AuthServices Authorization
{
get { return _auth ?? (_auth = new AuthServices()); }
}
/// <summary>
/// <see cref="LogHelper"/>
/// </summary>
protected LogHelper Log
{
get { return _log ?? (_log = new LogHelper()); }
}
/// <summary>
/// <see cref="Repository"/>
/// </summary>
protected Repository Repository
{
get { return _repository ?? (_repository = new Repository()); }
}
}注意惰性实例化。它允许我在运行测试之前溜进来,并用模拟设置我的私有字段。
至于会话,您的用户对象仍然可以保存在会话中,就像在传统的ASP.NET应用程序中一样。几乎所有的东西都还在(响应、缓存、会话等),但是其中一些已经被来自System.Web.Abstractions的类包装,这样就可以对它们进行模拟以进行测试。它们的行为方式仍然相同,尽管您不应该在传统角色中使用它们中的一些(例如,不要使用Response.Redirect,返回一个执行重定向的ActionResult,如RedirectToRouteResult )。
至于你问题背后的推理..。
不要强调单个db连接。取决于您的实现,这甚至可能是一个糟糕的想法,因为请求可能会相互影响。只需打开你的康奈,使用它,并处理/关闭当它完成。
另外,MVC带来的最大变化之一是拒绝了传统的ASP.NET试图为web开发带来的有状态模型。所有这些框架和视图不再存在(不要注意幕后的人)。你持有的状态越少,你的web应用程序就越不复杂,越健壮。试试吧,你可能会喜欢的。
发布于 2009-05-27 13:13:32
如果您使用会话,我建议您有一个session类,这样您只需要在代码中指定一次字符串名称,这也会给您IntelliSence。
public static class SessionHandler
{
// User Values
private static string _userID = "UserID";
private static string _userRole = "UserRole";
public static string UserID
{
get
{
if (HttpContext.Current.Session[SessionHandler._userID] == null)
{ return string.Empty; }
else
{ return HttpContext.Current.Session[SessionHandler._userID].ToString(); }
}
set
{ HttpContext.Current.Session[SessionHandler._userID] = value; }
}
public static string UserRole
{
get
{
if (HttpContext.Current.Session[SessionHandler._userRole] == null)
{ return string.Empty; }
else
{ return HttpContext.Current.Session[SessionHandler._userRole].ToString(); }
}
set
{ HttpContext.Current.Session[SessionHandler._userRole] = value; }
}
}发布于 2009-05-27 12:39:55
MVC中的会话没有任何变化。GlobalApplication类在Global.asax中仍然存在。页面也存在,您可能希望引用控制器中的存储库,而不是页。向基控制器类添加属性是可以的;我总是这样做。
https://stackoverflow.com/questions/915470
复制相似问题