gpt4 book ai didi

c# - CaSTLe Windsor - 如何在构造函数注入(inject)中映射命名实例

转载 作者:可可西里 更新时间:2023-11-01 08:42:36 29 4
gpt4 key购买 nike

也许这很容易,但是在网上搜索已经让我头疼了

问题是:

interface IValidator
{
void Validate(object obj);
}

public class ValidatorA : IValidator
{
public void Validate(object obj) { }
}

public class ValidatorB : IValidator
{
public void Validate(object obj) { }
}


interface IClassA { }
interface IClassB { }

public class MyBaseClass
{
protected IValidator validator;

public void Validate()
{
validator.Validate(this);
}
}

public class ClassA : MyBaseClass, IClassA
{
//problem: validator should ValidatorA
public ClassA(IValidator validator) { }
}

public class ClassB : MyBaseClass, IClassB
{
//problem: validator should ValidatorB
public ClassB(IValidator validator) { }
}

public class OtherClass
{
public OtherClass(IClassA a, IClassB b) { }
}


//on Main
var oc = container.Resolve<OtherClass>();

有什么想法吗?

编辑

我用 Named 注册了 ValidatorAValidatorB,现在的问题是 CaSTLe Windsor 如何正确地将这些验证器注入(inject) ClassAClassB,有没有办法做到这一点?或者有更好的解决方案吗?

如果有人认为我的类(class)设计有误,我欢迎您提出任何建议。到目前为止,我认为它是正确的。是的,验证器有特定类的特定配置。但它被抽象化是有原因的:

  1. Validator 是一个复杂的对象,有时应该连接到数据库,因此出于单元测试的原因,我必须将接口(interface)而不是实现传递给构造函数。
  2. 无法为任何验证器使用不同的接口(interface),因为我使用的唯一方法是 Validate
  3. 我认为 MyBaseClass.Validate() 是一种常见的模板方法模式,不是吗?

最佳答案

无需深入了解所选架构的细节,只关注 Windsor 容器配置:

如果您已经为给定接口(interface)(IValidator)注册了多个命名实现,您可以在注册消费者类(ClassAClassB) 使用 ServiceOverrides:

以下容器配置提供了一个 OtherClass 和一个 ClassA 实例,一个 ValidatorA 和一个 ClassB 实例,一个 验证器B:

var container = new WindsorContainer();

container.Register(Component.For<IClassA>().ImplementedBy<ClassA>()
.DependsOn(ServiceOverride.ForKey<IValidator>().Eq("ValidatorA")));
container.Register(Component.For<IClassB>().ImplementedBy<ClassB>()
.DependsOn(ServiceOverride.ForKey<IValidator>().Eq("ValidatorB")));

container.Register(Component.For<IValidator>().ImplementedBy<ValidatorA>()
.Named("ValidatorA"));
container.Register(Component.For<IValidator>().ImplementedBy<ValidatorB>()
.Named("ValidatorB"));

container.Register(Component.For<OtherClass>().ImplementedBy<OtherClass>());

var oc = container.Resolve<OtherClass>();

关于c# - CaSTLe Windsor - 如何在构造函数注入(inject)中映射命名实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11325699/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com