2

ビジネス層には、3 つのサービス インターフェイスが IUserService IRoleServiceあり、IGroupService

および 1 つのバリデータ インターフェイス IValidator IValidator には 3 つの実装がUserValidatorありRoleValidatorますGroupValidator

IUserService is implemented by UserService(IValidator userValidator)
IRoleService is implemented by RoleService(IValidator userValidator)
IGroupServiceis implemented by GroupService(IValidator userValidator)

3 つのサービスはすべて、IValidator をコンストラクタ パラメータとして使用します。

Web レイヤーには、コンストラクター パラメーターとして受け取るコントローラー、コンストラクター パラメーターとして受け取るコントローラー、およびコンストラクター パラメーターを受け取るグループ コントローラーが3つありUserControllerます。IUserServiceRoleControllerIRoleServiceIGroupServiceas

私の質問: 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 オブジェクトを取得します。

4

1 に答える 1

1

Windsor では、Service Overridesを使用してこれを行うことができます。

アップデート

次の設定があるとします。

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を選択する方法は次のとおりです。IMyServiceClassAClassB

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"))
    );
于 2013-01-04T22:07:57.937 に答える