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