Pergunta

Sou novo na ASP.NET MVC, vindo de uma experiência com PHP MVC.Tem sido uma transição meio estranha (veja meu histórico de perguntas, heh.)

Uma coisa que eu gosto muito na teoria e que é grande no mundo .Net é a ideia de modelos serem agnósticos em persistência.Mas, neste caso, qual é a maneira adequada de salvar as alterações em um modelo?Em PHP, eu apenas chamaria $model->save(); depois de fazer alguma transformação.Em C #, não tenho certeza de como fazer isso.

Isso é apropriado?

public class AwesomesauceController
{
    //inject!
    public AwesomeSauceController(IDataAccess da)
    {
        DataAccess = da;    
    }
    private readonly IDataAccess DataAccess;

    [HttpGet]
    public ActionResult Edit(int Id)
    {
        // PHP equiv: AwesomeSauceModel::find($id); Controller is unaware of DAL
        return View(DataAccess.AwesomeSauces.Where( sc => sc.Id == Id).FirstOrDefault());
    }

    [HttpPost]
    public ActionResult Edit(AwesomeSauce sc)
    {
        //persistence-aware version: model is aware of DAL, but controller is not
         if($sc->valid()
            $sc->save(); 
            redirect(); 
        }
        else { return view(); }

        // compare to persistence-agnostic version, controller is aware of DAL, but model is not
        if(ModelState.IsValid)
        {
            da.Persist(sc);
            return Redirect();
        }
        else
        {
            return View(sc);
        }
    }
}

Acho que a única coisa que me parece errada sobre isso é que, normalmente, eu não gostaria que um controlador acessasse diretamente uma camada de acesso a dados dessa maneira.Anteriormente, no terreno do PHP, meus controladores acessavam apenas modelos e visualizações, basicamente.

Foi útil?

Solução

O que você está fazendo está bem.ActiveRecord vs Repository vs Home Brew DAL é uma questão eterna que discutiremos para sempre.

O padrão de repositório é muito popular noNo mundo .NET agora, você provavelmente verá muitos exemplos de seu uso.O MVC não se importa com a sua estratégia de acesso a dados.Usar o que você achar confortável é ótimo e uma estratégia melhor do que usar um padrão, porque todo mundo está fazendo isso.

Outras dicas

É normal que um modelo tenha uma função Save (), mas você geralmente quer que o comportamento Save () seja independente do seu modelo - abstraído para uma interface.

Lembre-se de seus princípios de design: projete para uma interface, não uma implementação.

Outra ressalva é como você testa suas peças individualmente?Se um modelo não sabe como é persistido, ele pode ser testado com base no que um modelo deve fazer, e seu mecanismo de persistência pode ser testado com base no que deve fazer.

Em qualquer caso, parece que a sua ação Create () está cumprindo uma função dupla - tentar usar o modelo para salvar, depois tentar usar o DataAccess para persistir.Esses dois objetos estão fazendo a mesma coisa?Isso poderia ser confuso ou ilegível / impossível de manter mais tarde?

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