我的MVC应用程序中有以下代码,效果很好。

container.Register(Component.For<CountryServiceBase>()
    .ImplementedBy<CountryService>()
    .LifestylePerWebRequest());


温莎城堡创建一个组件

CountryService / CountryServiceBase


我的控制器在这里获取实例化的对象:

public class MyController : MainController
{
    public CountryServiceBase CountryService {get; set;} // instantiate by Ioc : OK


我的问题是我要注册很多课程。因此,使用温莎城堡进行了以下操作:

container.Register(
    Types
    .FromAssemblyNamed("mynamespace")
    .BasedOn(typeof(ServiceBase<>))
    .WithService.Base()
    .LifestylePerWebRequest());


温莎城堡创建了我的组件

CountryService / ServiceBase<Country>
CountryServiceBase / ServiceBase<Country>


但是我的MVC应用程序正在等待CountryService / CountryServiceBase,并且我不知道如何向Castle Windsor指定它可以将CountryServiceBase与CountryService匹配,因为这两个类(其中一个是抽象类)都继承了ServiceBase

可能吗?

注意:我发布了一个类似的问题,但是我的调查得出了一个更准确的问题,因此我删除了旧的问题。

最佳答案

通常services是接口。这就是AllInterfaces()为他人工作的原因。

如果您检查API,则会发现可以轻松使用的Select()方法。


  如果以上选项都不适合您,您可以提供自己的选项
  选择逻辑作为委托并将其传递给WithService.Select()
  方法。


因此,注册代码可能如下所示:

    container.Register(Types.FromThisAssembly()
        .BasedOn(typeof(ServiceBase<>))
        .WithService.AllInterfaces()
        .WithService.Select((t, b) => t.BaseType != null
                ? new[] { t.BaseType }
                : new Type[0])
        .LifestylePerWebRequest());


此解决方案非常快捷,但至少可以解决您的问题。

09-06 05:08