如何使用约定注册组件但动态命名?

时间:2014-01-29 00:44:43

标签: c# castle-windsor ioc-container

我目前正在注册具有特定名称的多个对象,我希望按惯例进行。

目前有效:

container.Register(Component.For<Repository>().Named("Repository1").ImplementedBy<Repository1>());
container.Register(Component.For<Repository>().Named("Repository2").ImplementedBy<Repository2>());

container.Register(
            Component.For<RepositoryFactorySelector, ITypedFactoryComponentSelector>().LifestyleSingleton(),
            Component.For<IRepositoryFactory>().AsFactory(c => c.SelectedWith<RepositoryFactorySelector>()));

我试过了:

container.Register(Classes.FromThisAssembly().BasedOn<Repository>().WithServiceDefaultInterfaces());

但是我的自定义Factory和DefaultTypedFactoryComponentSelector无法按名称找到组件?

  

在。中找不到名为'Repository2'的请求组件   容器。你忘了注册吗?

如何使用约定注册组件但动态命名?

1 个答案:

答案 0 :(得分:3)

在windsor页面上按惯例注册组件(http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx),以下代码段可以帮助您:

container.Register(
   Classes.FromAssembly(Assembly.GetExecutingAssembly())
      .BasedOn<ICommon>()
      .LifestyleTransient()
      .Configure(component => component.Named(component.Implementation.FullName + "XYZ"))

);

顺便问一下,为什么不更改组件选择器以根据实现类型选择正确的处理程序?

亲切的问候, Marwijn。