Asp.net mvc 温莎组件注册例外
我正在尝试使用windsor在我的mvc应用程序中注册一个新组件 首先,我引用了所有温莎DLL 然后我用了这个代码: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
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))
);