Рекомендации по контексту данных MVC3 - PullRequest
1 голос
/ 19 декабря 2011

Это действие у меня в контроллере. Считается ли плохой практикой создание и удаление соединения с базой данных (то есть 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 ]

2 голосов
/ 19 декабря 2011

Вероятно, вы примете во внимание размер вашего приложения.Я бы сказал, что разделение модели - это лучшая практика, но для небольших приложений, возможно, вам следует просто обернуть 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 голос
/ 19 декабря 2011

Согласитесь с Дэвидом, поскольку это зависит от размера вашего заявления.

Однако я бы предложил использовать внедрение зависимостей для управления подключением.

Используя что-то вроде StructureMap , вы можете получить что-то вроде этого:

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

Что означает:

Когда что-то запрашивает PhotoGalleryContext , присвойте ему новый PhotoGalleryContext , который HTTP-ограничен (создается в начале запроса, располагается в конце).

Таким образом, StructureMap автоматически открывает / закрывает соединение для вас.

Тогда ваш контроллер может выглядеть так:

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

И в ваших методах действия, _db будет готов пойти за вами.

Несколько строк кода, чтобы сохранить много повторяющихся операторов в вашем приложении.

...