Chciałbym zastosować pewne zagadnienia przekrojowe do moich kontrolerów MVC. W tej chwili jest to realizowane przez abstrakcyjną klasę bazową, ale ponieważ refaktoryzujemy więcej kodu źródłowego, aby skorzystać z wtrysku zależności, zastanawiam się, czy to jest coś, co Simple Injector może mi pomóc dzięki swoim urządzeniom do dekoracji lub przechwytywania .Jak ozdobić kontroler ASP.NET MVC za pomocą prostego wtryskiwacza
Tak już próbowali stworzyć dość podstawowy dekorator:
public class ControllerDecorator : IController
{
private readonly IController _controller;
public ControllerDecorator(IController controller)
{
_controller = controller;
}
public void Execute(RequestContext requestContext)
{
// Do something of a cross-cutting nature here...
_controller.Execute(requestContext);
}
}
I w moim korzeni Skład: container.RegisterDecorator<IController, ControllerDecorator>()
Jednak kod w Execute
sposobu mojego dekoratora nie wydają się kiedykolwiek nazywa. Czy to dlatego, że framework MVC bezpośrednio rozwiązuje moje klasy kontrolerów, zamiast przechodzić przez IController
? W takim razie, co mogę zrobić? Czego tu mi brakuje?
Niesamowite, dzięki! Musiałem jednak dokonać jednej zmiany w kodzie: w wywołaniu 'ControllerBuilder.Current.SetControllerFactory', musiałem użyć instancji' controllerFactory' utworzonej przed weryfikacją kontenera. Jeśli nie tworzysz go przed wywołaniem 'Zweryfikuj', dostanę komunikat ostrzegawczy; jeśli zostanie utworzona ponownie w metodzie 'SetControllerFactory', nic się nie dzieje i dekorator nigdy nie zostanie zastosowany. Jakiś pomysł, dlaczego tak jest? –
@MartinWedvich ah tak, oczywiście. Fabryka kontrolera wyłącza diagnostykę. Obvoiusly musisz go pominąć, zanim zweryfikujesz – Steven
Po wywołaniu 'container.Verify', producenci w' controllerProds' zostali zmutowani z klas kontrolerów (np. 'HomeController') na' ControllerDecorator', i wygląda na to, że jest to powód, dla którego to się nie udaje, jeśli ponownie zainstaluję fabrykę po raz drugi. Czy to zamierzone zachowanie? –