piątek, 8 czerwca 2012

ASP.NET MVC - odc.3

W tym odcinku trochę na temat rozszerzalności ASP.NET MVC w wersji 3 w powiązaniu z kontenerami IoC.

Rozwiązywanie zależności

public ActionResult Index() {

var repository = DependencyResolver.Current.GetService<IProductRepository>();

var model = repository.GetLatestProducts();

return View(model);

}

Rozszerzalność

Własne

  • Fabryka kontrolerów - ControllerBuilder
  • Bindery modeli - ModelBinders
  • Model metadanych - providery

Do wszystkich elementów DependencyResolver - od wersji 3

class MyResolver: IDependencyResolver  {

public object GetService(Type serviceType)  { //… }

public IEnumerable<object> GetServices(Type serviceType)  {  //… }

}

W implementacji resolvera zwykle wykorzystuje się kontenery IoC. Sam resolver jest rozwiązywany, a implementacje jego metod stanowią opakowanie metod rozwiązujących danego kontenera.

w Application_Start():

zainicjowanie wybranego frameworka IoC

DependencyResolver.SetResolver(new MyResolver());

Wszędzie dependency injection (od wersji 3).

Widoki

  • engine widoków
  • widoki

public abstract class MessagingWebViewPage<T>: WebViewPage<T> {

       //property zasilane przez wybrany kontener IoC

  public IMessenger Messenger { get; set; }

}

Użycie w Razor

na stronie:

@inherits MessagingWebViewPage<dynamic>

@{

Messenger.SendMessage(“Mks ….”);

}

można też globalnie w Web.config:

<system.web.webPages.razor>

<pages pageBaseType=”System.Web.Mvc.WebViewPage”>

Aktywatory (od wersji 3)

  • IControllerActivator - kontrola nad życiem kontrolera
  • IViewPageActivator - kontrola nad życiem widoku

Rozszerzalność filtrów akcji

  • Filtry akcji od wersji 3 nie wymagają atrybutów
    • IActionFilter
    • IResultFilter
    • IExceptionFilter
    • IAuthorizationFilter
  • Filtry pobierane z providerów IFilterProvider
  • 3 providery skonfigurowane jako domyślne
    • Global filter provider
    • Attribute filter provider
    • Controller instance provider

Własny provider

public class MessagingFilterProvider:  IFilterProvider {

          …

          public IEnumerable<Filter> GetFilters(ControllerContext controllerContext,

                                                                                     ActionDescriptor actionDescriptor) {

                 yield return new Filter(pobranie danego typu filtra np. MessageFilter przez IoC,

                                            FilterScope.Global,

                                            order: null);

           }

}

public class MessageFilter: IActionFilter {

public void OnActionExecuting(ActionExecutingContext filterContext) {

      …

}

public void OnActionExecuted(ActionExecutedContext filterContext) {

}

}

Rozszerzalność modelu

  • IModelBinderProvider - wiele serwisów do lokalizowania binderów modeli
    • GetBinder()
  • ModelMetadataProvider - pojedynczy serwis do lokalizowania metadanych dla modeli
    • GetMetadataForProperties()
    • GetMetadataForProperty()
    • GetMetadataForType()
  • ModelValidatorProvider - wiele serwisów do dostarczania walidatorów
    • GetValidators()

Brak komentarzy: