Tôi đang sử dụng Castle Windsor để quản lý các trường hợp bộ điều khiển (trong số những thứ khác). máy điều khiển của tôi trông như thế này:Tại sao bộ điều khiển GetControllerInstance của Castle Windsor của tôi được gọi với giá trị null?
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
}
Khi tôi khởi động ứng dụng ASP.Net MVC của tôi và cố gắng đi đến "/" (hoặc đường dẫn khác), tôi nhận được một ArgumentNullException. Tôi đặt một điểm break vào mục nhập của GetControllerInstance và thấy rằng nó được gọi là một lần với HomeController của tôi, sau đó một lần thứ hai với null (đó là khi ngoại lệ được ném). Tại sao nó lại được gọi lại?
Tôi có nên thay đổi phương thức để một cái gì đó như thế này:
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null)
return null;
return (IController)_container.Resolve(controllerType);
}
Tại sao bạn hack đăng ký với sự phản ánh thay vì sử dụng API đăng ký phù hợp? –
@Krzysztof - Tôi đang theo dõi ví dụ của Steve Sanderson. Nếu bạn muốn đăng một cách tốt hơn để đăng ký tất cả các lớp kế thừa từ bộ điều khiển, hãy làm như vậy. – scottm