Używam Castle Windsor do zarządzania instancjami kontrolerów (między innymi). Mój zakład kontroler wygląda następująco:Dlaczego moja fabryka kontrolera GetControllerInstance() mojego zamku Windsor jest wywoływana z wartością pustą?
public class WindsorControllerFactory : DefaultControllerFactory
{
private WindsorContainer _container;
public WindsorControllerFactory()
{
_container = new WindsorContainer(new XmlInterpreter());
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where typeof(Controller).IsAssignableFrom(t)
select t;
foreach (Type t in controllerTypes)
{
_container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
}
}
protected override IController GetControllerInstance(Type controllerType)
{
return (IController)_container.Resolve(controllerType); // ArgumentNullException is thrown here
}
Kiedy uruchomić mojej aplikacji ASP.Net MVC i starają się iść na „/” (lub inna ścieżka), otrzymuję ArgumentNullException. Wprowadziłem przerwę w wejściu do GetControllerInstance i stwierdziłem, że jest ono wywoływane raz z moim HomeControllerem, a następnie po raz drugi z wartością null (która jest wtedy, gdy zgłoszony zostanie wyjątek). Dlaczego jest on ponownie wywoływany?
Czy mogę zmienić metodę do czegoś takiego:
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null)
return null;
return (IController)_container.Resolve(controllerType);
}
Czemu hacking rejestrację z refleksji zamiast używać odpowiedniego API rejestracyjny? –
@ Krzysztof - Podążałem za przykładem Steve Sandersona. Jeśli chcesz opublikować lepszy sposób rejestrowania wszystkich klas dziedziczących po kontrolerze, zrób to. – scottm