注册不同的实现
本文关键字:实现 注册 | 更新日期: 2023-09-27 17:50:39
在业务层,我有三个服务接口IUserService
、IRoleService
、IGroupService
和一个验证器接口IValidatorIValidator有3种实现——UserValidator
, RoleValidator
, GroupValidator
。
IUserService is implemented by UserService(IValidator userValidator)
IRoleService is implemented by RoleService(IValidator userValidator)
IGroupServiceis implemented by GroupService(IValidator userValidator)
这三个服务都以IValidator作为构造函数参数。
在web层,我有3个控制器UserController
以IUserService
作为构造函数参数,RoleController
以IRoleService
作为构造函数参数,和组控制器接受IGroupServiceas
的构造函数参数
我的问题:如何强制roleService获取RoleValidator
对象和GroupService
获取GroupValidator
对象
我用的是castle windsor 3.1
windsorContainer.Register(Component.For<IValidator>()
.ImplementedBy<UserValidator>()
.Named("userValidator")
.LifestyleTransient());
windsorContainer.Register(Component.For<IValidator>()
.ImplementedBy<RoleValidator>()
.Named("roleValidator")
.LifestyleTransient());
windsorContainer.Register(Component.For<IValidator>()
.ImplementedBy<GroupValidator>()
.Named("groupValidator")
.LifestyleTransient());
我在注册userValidator时使用IsFallback()
,但所有3个服务都获得roleValidator对象。
Windsor允许你通过服务覆盖来实现。
给出如下设置:
public interface IMyService
{
}
public class Concrete1 : IMyService
{
}
public class Concrete2 : IMyService
{
}
public class ClassA
{
private IMyService service;
public ClassA(IMyService service)
{
this.service = service;
}
}
public class ClassB
{
private IMyService service;
public ClassB(IMyService service)
{
this.service = service;
}
}
下面是如何使用DependsOn
来选择ClassA
和ClassB
构造函数的"service"参数所使用的IMyService
实现:
var container = new WindsorContainer();
container.Register(
Component.For<IMyService>().ImplementedBy<Concrete1>().Named("C1"),
Component.For<IMyService>().ImplementedBy<Concrete2>().Named("C2"),
Component.For<ClassA>().DependsOn(Dependency.OnComponent("service", "C1")),
Component.For<ClassB>().DependsOn(Dependency.OnComponent("service", "C2"))
);