Исключение регистрации компонентов с помощью windsor - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь зарегистрировать новый компонент в своем приложении mvc, используя windsor ..

Сначала я сослался на все dll в windsors ..

Затем я использовал этот код:

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: Компонент SportsStore.Controllers.ProductController не может быть зарегистрирован.Уже есть компонент с таким именем.Вы хотите изменить существующий компонент?Если это не так, убедитесь, что вы указали уникальное имя.] Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register (обработчик IHandler) в каталоге c: \ BuildAgent \ work \ 9834359f44c23fee \ src \ Castle.Windsor \ MicroKernel \ SubSystems \ Naming \ DefaultNamingSamingSamingS.cs: ​​237 Castle.MicroKernel.Castle.MicroKernel.DefaultKernel.RegisterHandler (имя строки, обработчик IHandler) в каталоге c: \ BuildAgent \ work \ 9834359f44c23fee \ src \ Castle.Windsor \ MicroKernel \ DefaultKernel.cs: 713 Castle.MicroKernel.DefaultKernel.TypeCenton., Введите classType, LifestyleType lifestyle, логическое перезаписьLifestyle) в c: \ BuildAgent \ work \ 9834359f44c23fee \ src \ Castle.Windsor \ MicroKernel \ DefaultKernel_ObsoleteAPI.cs: 106 Castle.MicroKernel.DefaultKernel.AddType Type, тип образа жизни, класс типа жизни (класс компонента)Boolean overwriteLifestyle) в c: \ BuildAgent \ work \ 9834359f44c23fee \ src \ Castle.Windsor \ MicroKernel \ DefaultKernel_ObsoleteAPI.cs: 59 Castle.Windsor.WindsorContainer.AddComponentLifeStyle (строковый ключ, тип образа \ рабочий тип в стиле \ рабочий тип)\ 9834359f44c23fee \ src \ Castle.Windsor \ Windsor \ WindsorContainer_ObsoleteAPI.cs: 94 WindsorControllerFactory..ctor () в D: \ Call.of.Duty.Modern.Warfare.3-RELOADED \ SportsStore \ SportsStore \ SportsStoreF WindoryControl: Контроллер33 SportsStore.MvcApplication.Application_Start () в D: \ Call.of.Duty.Modern.Warfare.3-RELOADED \ SportsStore \ SportsStore \ SportsStore \ Global.asax.cs: 31

Я изменил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>

и в глобальном asax-файле я добавил эту строку:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    ControllerBuilder.Current.SetControllerFactory(
        new WindsorControllerFactory());
    RegisterRoutes(RouteTable.Routes);
}

Контейнер / windsorContainer пуст, как вы можете видеть из ИнтернетаФайл .config, в нем есть пустой компонент .. и у меня есть только один контроллер для добавления --- Называется ProductController..Так как он добавляет контроллер дважды? !!?

1 Ответ

0 голосов
/ 10 января 2012

Попробуйте использовать Регистрация вместо

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))
);
...