Asp.net mvc 温莎组件注册例外

Asp.net mvc 温莎组件注册例外,asp.net-mvc,castle-windsor,Asp.net Mvc,Castle Windsor,我正在尝试使用windsor在我的mvc应用程序中注册一个新组件 首先,我引用了所有温莎DLL 然后我用了这个代码: public class WindsorControllerFactory : DefaultControllerFactory { WindsorContainer container; public WindsorControllerFactory() { container = new WindsorContainer(new Xm

我正在尝试使用windsor在我的mvc应用程序中注册一个新组件

首先,我引用了所有温莎DLL

然后我用了这个代码:

public class WindsorControllerFactory : DefaultControllerFactory
{
    WindsorContainer container;

    public WindsorControllerFactory()
    {
        container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

        //Registers all components as transient.
        var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                              where typeof(IController).IsAssignableFrom(t)
                              select t;

        foreach(Type t in controllerTypes)
        {
            container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);//Exception thrown here
        }
    }

    protected  virtual IController GetControllerInstance(Type controllerType)
    {
        return (IController)container.Resolve(controllerType);
    }
}
例外情况:

[ComponentRegistrationException:Component SportsStore.Controllers.ProductController无法注册。已存在具有该名称的组件。是否改为修改现有组件?如果不,请确保指定唯一的名称。] c:\BuildAgent\work\9834359f44c23fee\src\Castle.Windsor\MicroKernel\subsystem\Naming\DefaultNamingSubSystem.cs:237中的Castle.MicroKernel.subsystem.Naming.DefaultNamingSubSystem.Register(IHandler处理程序) c:\BuildAgent\work\9834359f44c23fee\src\Castle.Windsor\MicroKernel\DefaultKernel.RegisterHandler(字符串名称、IHandler处理程序、布尔SkipPregistration)中的Castle.MicroKernel.DefaultKernel.Castle c:\BuildAgent\work\9834359f44c23fee\src\Castle.Windsor\MicroKernel\DefaultKernel.RegisterHandler(字符串名称,IHandler处理程序)中的Castle.MicroKernel.DefaultKernel.RegisterHandler c:\BuildAgent\work\9834359f44c23fee\src\Castle.Windsor\MicroKernel\DefaultKernel\DefaultKernel\AddComponent中的Castle.MicroKernel.AddComponent(字符串键、类型serviceType、类型classType、生活方式、布尔覆盖Festyle) c:\BuildAgent\work\9834359f44c23fee\src\Castle.Windsor\MicroKernel\DefaultKernel\DefaultKernel\u ObsoleteAPI.cs:59中的Castle.MicroKernel.DefaultKernel.AddComponent(字符串键、类型classType、生活方式、布尔覆盖模式) c:\BuildAgent\work\9834359f44c23fee\src\Castle.Windsor\Windsor\WindsorContainer.AddComponentLifeStyle(字符串键、类型类类型、生活方式类型生活方式)中的Castle.Windsor.WindsorContainer.AddComponentLifeStyle(字符串键、类型类类型、生活方式类型生活方式):94 D:\Call.of.Duty.Modern.war.3-reload\SportsStore\SportsStore\SportsStore\WindsorController工厂.cs:33中的WindsorController工厂..ctor() D:\Call.of.Duty.Modern.war.3-reload\SportsStore\SportsStore\SportsStore\SportsStore\Global.asax.cs:31中的SportsStore.mvcapApplication.Application\u Start()文件

我修改了web.config,如下所示:

 <configSections>
    <section name="castle"
    type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,
Castle.Windsor" />
    <!-- ... leave all the other section nodes as before ... -->
  </configSections>


  <castle>
    <components>
    </components>
  </castle>

正如您在web.config文件中看到的,容器/windsorContainer是空的,它有空的组件..而我只有一个要添加的控制器--称为ProductController..那么它为什么要添加两次控制器

尝试改用寄存器

container.Register
(
    AllTypes.FromThisAssembly()//Identify assembly containing your controllers
        .BasedOn<IController>()
        .If(Component.IsInSameNamespaceAs<Controllers.HomeController>())
        .If(t => t.Name.EndsWith("Controller"))
        .Configure((c => c.LifeStyle.Transient))
);
container.Register
(
AllTypes.FromThisAssembly()//标识包含控制器的程序集
.BasedOn()
.If(Component.IsInSameNamespaceAs())
.If(t=>t.Name.EndsWith(“控制器”))
.Configure((c=>c.lifesture.Transient))
);

如果在调试器中查看,则
控制器类型
集合的内容是什么?它有一个控制器。。。当它进入循环时,它抛出一个异常,表示该控制器已经被添加,这是温莎背后的原因。。功能就是为具有不同接口/类型的控制器提供服务,这样,如果我愿意,就可以改变这些行为了吗?
container.Register
(
    AllTypes.FromThisAssembly()//Identify assembly containing your controllers
        .BasedOn<IController>()
        .If(Component.IsInSameNamespaceAs<Controllers.HomeController>())
        .If(t => t.Name.EndsWith("Controller"))
        .Configure((c => c.LifeStyle.Transient))
);