注册不同的实现

本文关键字:实现 注册 | 更新日期: 2023-09-27 17:50:39

在业务层,我有三个服务接口IUserServiceIRoleServiceIGroupService

和一个验证器接口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个控制器UserControllerIUserService作为构造函数参数,RoleControllerIRoleService作为构造函数参数,和组控制器接受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来选择ClassAClassB构造函数的"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"))
    );