我正在使用 MVC3,目前我正在遵循一种做法,即我为每个控制器声明一个 DB Container 实例。对于到达该控制器的每个请求,我都会使用该容器实例。如果我需要去我的模型进行查询或某事,我会将该实例作为参数发送给模型的函数。因此,对于整个应用程序,我创建并使用了 4-5 个不同的 DB Container 类实例。我的问题是,这对我的数据库操作有好处还是坏处?创建一个单独的容器实例是否重要?使用容器类的正确方法是什么?
我相信之前提到的类被称为 DBContext 。
我正在使用 MVC3,目前我正在遵循一种做法,即我为每个控制器声明一个 DB Container 实例。对于到达该控制器的每个请求,我都会使用该容器实例。如果我需要去我的模型进行查询或某事,我会将该实例作为参数发送给模型的函数。因此,对于整个应用程序,我创建并使用了 4-5 个不同的 DB Container 类实例。我的问题是,这对我的数据库操作有好处还是坏处?创建一个单独的容器实例是否重要?使用容器类的正确方法是什么?
我相信之前提到的类被称为 DBContext 。
我不确定这是你的意思,但我可以给你一个我经常遵循的方法的例子:
为 DBContext 创建一种“域服务类”
public class MyDomainService : IDisposable
{
private MyDbEntities dbo;
private bool isDisposed;
public MyDomainService()
{
dbo = new MyDbEntities();
}
public User GetUser(string userName)
{
return (from usr in dbo.Users
where usr.UserName == userName
select usr).SingleOrDefault();
}
public void Dispose()
{
if (isDisposed)
return;
isDisposed = true;
dbo.Dispose();
}
}
创建一个自定义 Controller 类,该类扩展Controller
或AsyncController
覆盖Initialize
andDispose
方法:
public class MyController : Controller
{
protected MyDomainService DomainService { get; private set; }
protected override void Initialize(System.Web.Routing.RequestContext
requestContext)
{
base.Initialize(requestContext);
DomainService = new MyDomainService();
}
protected override void Dispose(bool disposing)
{
DomainService.Dispose();
base.Dispose(disposing);
}
}
现在您可以在每个示例中使用以下方法HomeController
继承MyController
public class HomeController : MyController
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(string username)
{
var user = DomainService.GetUser(username);
if (user != null)
return RedirectToAction("Account", "Information");
return View();
}
}
这将使您的控制器相当干净。