MVC3数据上下文最佳实践



这是我在控制器中的一个动作。它被认为是坏的做法是创建和处置数据库连接(即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;
    }

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

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;
}

同意David的观点,这取决于你的应用程序的大小。

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

使用类似StructureMap的东西,你可以有这样的东西:

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

翻译过来就是:

当某些东西请求PhotoGalleryContext时,给它一个新的PhotoGalleryContext,这是 http作用域(在请求开始时创建,在结束时处理)。

这样StructureMap会自动为你打开/关闭连接。

那么你的控制器可以像这样:

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

在你的行动方法中,_db将准备好为你而去。

只需几行代码,就可以在整个应用程序中节省大量重复的using语句。

最新更新