我的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());
此解决方案非常快捷,但至少可以解决您的问题。