попытка проложить себе путь через Steve Sandersons книга MVC - но врезалась в кирпичную стену при создании WindsorControllerFactory. Выглядит, как будто метод изменился от MVC1 до MVC2. Это - ошибка, которую я получаю при попытке скомпилировать проект:
'WebUI.WindsorControllerFactory. GetControllerInstance (Система. Введите: никакой подходящий метод, который, как находят, переопределял'. Любая справка ценилась бы - я не могу закончить это!
Это - код - как записано из книги:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using Castle.Core.Resource;
using System.Reflection;
using Castle.Core;
using Castle.MicroKernel;
namespace WebUI
{
public class WindsorControllerFactory : DefaultControllerFactory
{
WindsorContainer container;
// The constructor:
// 1. Sets up a new IoC container
// 2. Registers all components specified in web.config
// 3. Registers all controller types as components
public WindsorControllerFactory()
{
// Instantiate a container, taking configuration from web.config
container = new WindsorContainer(
new XmlInterpreter(new ConfigResource("castle"))
);
// Also register all the controller types as transient
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where typeof(IController).IsAssignableFrom(t)
select t;
foreach (Type t in controllerTypes)
container.AddComponentWithLifestyle(t.FullName, t, LifestyleType.Transient);
}
// Constructs the controller instance needed to service each request
protected override IController GetControllerInstance(Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
}
}
++++ С уважением, Martin
GetControllerInstance изменился с ASP.NET MVC 1.0 в ASP.NET MVC 2 из-за неудачной ошибки в отношении условий расы.
Подпись в ASP.NET MVC 1.0 была:
protected virtual IController GetControllerInstance(
Type controllerType);
и в ASP.NET MVC 2 именно:
protected virtual IController GetControllerInstance(
RequestContext requestContext,
Type controllerType)
для этого конкретного случая, похоже, вам нужно только изменить подпись вашего метода в:
protected override IController GetControllerInstance(
RequestContext requestContext, Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
Основное состояние гонки заключалось в том, что экземпляр requestcontext может быть разделен несколькими одновременными запросами, что было бы основным отсутствием - нет. К счастью, казалось, что пользователи не работали в этом вопросе, но в любом случае он был исправлен в ASP.NET MVC 2.
В MVC2 подпись этого метода следующая:
protected internal virtual IController GetControllerInstance(
RequestContext requestContext,
Type controllerType
)
(Взято из MSDN)
.