这是我在控制器中执行的操作。在此控制器内部创建和部署数据库连接(即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;
}
答案 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
将随时为您服务。
在您的应用程序中保存大量重复使用语句的代码行很少。