MVC3数据上下文最佳实践

时间:2011-12-18 22:22:23

标签: database asp.net-mvc-3 controller repository datacontext

这是我在控制器中执行的操作。在此控制器内部创建和部署数据库连接(即PhotoGalleryContext - 与MySql数据库的连接)被认为是不好的做法,而不是通过在模型中的数据访问层中完成此操作来实现抽象。 cs班?

    // GET: /Admin/GetPhoto/id
    public ActionResult GetPhoto(int id)
    {
        PhotoGalleryContext db = new PhotoGalleryContext();

        Models.PhotoGallery.Photo photo = new Models.PhotoGallery.Photo();
        photo = db.Photos.Where(p => p.PhotoId == id).Single();

        string filePath = photo.FileLocation;

        db.Dispose();    

        byte[] byteArray;
        try
        {
            byteArray = System.IO.File.ReadAllBytes(filePath);
            return File(byteArray, "image/jpg");
        }
        catch (Exception)
        {
            //throw;
        }
        return null;
    }

2 个答案:

答案 0 :(得分:2)

在决定时,您可能会考虑应用程序的大小。我想说分离模型是一种最佳实践,但对于较小的应用程序,也许您应该将PhotoGalleryContext包装在一个使用块中:

using(PhotoGalleryContext db = new PhotoGalleryContext())
{

    Models.PhotoGallery.Photo photo = new Models.PhotoGallery.Photo();
    photo = db.Photos.Where(p => p.PhotoId == id).Single();

    string filePath = photo.FileLocation;
    byte[] byteArray;
    try
    {
        byteArray = System.IO.File.ReadAllBytes(filePath);
        return File(byteArray, "image/jpg");
    }
    catch (Exception)
    {
        //throw;
    }
    return null;
}

答案 1 :(得分:1)

同意David,因为它取决于您的申请的大小。

但是,我建议使用依赖注入为您管理连接。

使用像StructureMap之类的东西,你可以这样:

For<PhotoGalleryContext>()
   .HybridHttpOrThreadLocalScoped
   .Use<PhotoGalleryContext>();

转换为:

  

当某些内容要求 PhotoGalleryContext 时,请为其提供 PhotoGalleryContext HTTP-scoped (在请求开始时创建,处置为端)。

这样,StructureMap将自动为您打开/关闭连接。

然后您的控制器可能如下所示:

private readonly PhotoGalleryContext _db;
public AdminController(PhotoGalleryContext db)
{
   _db = db;
}

在您的行动方法中,_db将随时为您服务。

在您的应用程序中保存大量重复使用语句的代码行很少。