DI container a modely v ASP.NET/MVC rubrika: Programování: .Net

4 pilif
položil/-a 24.11.2016

Zdravím ve spolek,
začínám používat Castle.Winsdor a řeším jeho správné nasazení.

Momentálně to mám navržené zhruba takto:
Používám vzor repozitory a pomocí DI jej chci dostat do jednotlivých modelů v ASP.NET/MVC.
Pro upřesnění typicky metoda v controlleru a model třída:

public ActionResult Edit(int id) {
  var model = container.Resolve<AnyModelClass>();
  model.LoadById(id);
  return View(model);
}
 
 
// zde je model vytvářen pravděpodobně v DefaultModelBinderu, kde jsem zvažoval přepsat metodu CreateModel,
// ale nedospěl jsem k nějakému správnému řešení
public ActionResult SaveData(AnyModelClass model) {
  if (ModelState.IsValid) {
    ...
  }
  return View(model)
}
 
 
// ----------------------------------------
 
public class AnyModelClass {
 
  public AnyModelClass(IDependencyRepository repo, IAppContext context) {
    ...
  }
 
  public void LoadById(int id) {
    ...
  }
 
}

A zde nevím jak do instance této model třídy AnyModelClass "injektovat" závislosti.
Chtěl bych závislosti vkládat vždy přes konstruktor, ovšem model v MVC vyžaduje bezparametrický konstruktor.

Komentáře

  • harrison314 : Tu mavaju ludia zmetok v terminologii, model - domenovy model, view model - to co strkas do pohladu, malo by ist o cistu POCO triedu (vsteky data by mali byt pripravene este prred volanim metody View, ma to svoje opodstatnie, napriklad error henadling). 25.11.2016
odkaz
9 Honza Břešťan
odpověděl/-a 24.11.2016

Model v ASP.NET MVC je jen prepravka pro View, ne plnohodnotny Model, jak je ten termin pouzivany ve vetsine ostatnich MVC implementaci. V pojeti ASP.NET MVC je zvykem repository (resp. casteji Unit of Work) injektovat do Controlleru, pripadne do nejake Service, na kterou Controller deleguje logiku. S tim souvisi duvod, proc musi Model mit bezparatemtricky konstruktor - kvuli snadne a rychle deserializaci. IoC container neni zadarmo a na rozdil od Controlleru, jejichz instance jdou reusovat, se pro kazdy request vytvari novy Model, takze to musi jit rychle a bez slozitosti.

Controller infrastruktura v ASP.NET MVC je naopak na DI pripravena. Vytvareni Controlleru se da snadno ovlivnit pres ControllerFactory a ta pak slouzi jako composition root, kde se da IoC container referencovat a pouzivat - Controller samotny by o jeho existenci uz vubec nemel vedet. Priklad na to jsem nasel treba tady: https://gist.github.com/martinnormark/3128275 Trochu se to ale muze lisit podle major verze ASP.NET MVC, protoze autori radi kompletne meni public API. Konceptualne je to ale stejne.

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.