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:
Prześlij komentarz