Pergunta

Eu tenho um aplicativo que foi escrito em baunilha ASP.NET que eu gostaria de porta sobre a ASP.NET MVC.

No entanto, eu estou confuso sobre o lugar certo para persistir objetos. Eu preciso persistir por dois motivos:

  1. Eu gostaria que todos possam ter um conexão única base de dados, envolto em um "repositório" ou "gerente" objeto de estilo.
  2. Cada usuário tem um objeto de usuário que precisa ser salvo em uma base por sessão.

Normalmente, eu diria que # 1 seria salvo como um item estático no Globals.asax que pode ser atingido usando Global.Repository ou similar.

E eu normalmente dizer que # 2 deve ser uma propriedade com um algum lugar sessão de armazenamento de backup na classe base das páginas.

Agora, a razão pela qual eu estou confuso é que eu ouvi dizer que as sessões foram alterados no MVC, eo Global.asax não detém mais da mesma classe. Além disso, o conceito de páginas foi removido, assim que adicionar uma propriedade para a classe base de um controlador parece ... errado.

O que dizer yall?

Foi útil?

Solução

Seu banco de dados iria em uma classe base para seus controladores. Esta classe base deve estender Controller, e todos os seus controladores devem estender a classe base. Aqui está um pequeno exemplo:

public class BaseController : Controller
{
    private AuthServices _auth;
    private LogHelper _log;
    private Repository _repository;

    /// <summary>
    /// <see cref="AuthServices"/>
    /// </summary>
    protected AuthServices Authorization
    {
        get { return _auth ?? (_auth = new AuthServices()); }
    }

    /// <summary>
    /// <see cref="LogHelper"/>
    /// </summary>
    protected LogHelper Log
    {
        get { return _log ?? (_log = new LogHelper()); }
    }

    /// <summary>
    /// <see cref="Repository"/>
    /// </summary>
    protected Repository Repository
    {
        get { return _repository ?? (_repository = new Repository()); }
    }
}

Observe a instanciação preguiçoso. Que me permite esgueirar-se antes de executar testes e definir meus campos particulares com simulações.

Como para a sessão, o seu objeto de usuário ainda pode ser salvo na sessão, assim como em uma aplicação ASP.NET tradicional. Quase tudo ainda está por aí (Response, Cache, Session, etc), mas alguns deles têm sido envolvido com aulas de System.Web.Abstractions para que eles possam ser ridicularizado por testes. Todos eles ainda se comportam da mesma forma, embora você não deve usar alguns deles em seu papel tradicional (por exemplo, não Response.Redirect, retornar um ActionResult como RedirectToRouteResult que realiza o seu redirecionamento).

Como para o raciocínio por trás suas perguntas ....

Não se estresse em uma única conexão db. Dependendo da sua aplicação pode até ser uma má idéia, como pedidos podem pisar em outro. Basta abrir o seu connex, usá-lo, e dispor / close-lo quando terminar.

Além disso, uma das maiores mudanças que MVC traz é a rejeição do modelo stateful que tradicional ASP.NET tentou trazer para o desenvolvimento web. Tudo o que estrutura e viewstate não existe mais (não pagam a atenção para o homem por trás da cortina). A menos estado em que se apegar a menos complexo e mais robusta sua aplicação web é. Experimente, você pode gostar dele.

Outras dicas

Se você usar sessões Eu recomendaria ter uma classe sessão, para que você só precisa especificar o nome de seqüência de vez em código e isso vai lhe dar intellisence também.

 public static class SessionHandler
{   
    // User Values
    private static string _userID = "UserID";
    private static string _userRole = "UserRole";

    public static string UserID
    {
        get
        {
            if (HttpContext.Current.Session[SessionHandler._userID] == null)
            { return string.Empty; }
            else
            { return HttpContext.Current.Session[SessionHandler._userID].ToString(); }
        }
        set
        { HttpContext.Current.Session[SessionHandler._userID] = value; }

    }

    public static string UserRole
    {
        get
        {
            if (HttpContext.Current.Session[SessionHandler._userRole] == null)
            { return string.Empty; }
            else
            { return HttpContext.Current.Session[SessionHandler._userRole].ToString(); }
        }
        set
        { HttpContext.Current.Session[SessionHandler._userRole] = value; }

    }
}

As sessões não mudou nada no MVC. A classe GlobalApplication em Global.asax ainda existe, também. Existem páginas, também, que você iria querer referir-se a um repositório em um controlador ao invés de uma página. Adicionando uma propriedade para uma classe de controlador de base é muito bem; Eu faço isso o tempo todo.

Você pode criar um fichário de modelo para o estado encapsular.

(livro MVC See de Steve Sanderson em seu carrinho de compras implementação)

Com o fichário de modelo, você tem acesso ao ControllerContext - que tem o HttpContext

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top