DI container a modely v ASP.NET/MVC rubrika: Programování: .Net
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.
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:
Nebo se přihlaste jménem a heslem:
Komentáře