ktu*_*nik 11 c# castle-windsor
也许这很容易,但在互联网上搜索已经让我头疼
这是问题所在:
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>();
Run Code Online (Sandbox Code Playgroud)
任何的想法?
编辑
我注册ValidatorA和ValidatorB使用Named,现在的问题是如何温莎城堡可以适当注入这些验证的ClassA和ClassB,是有办法做到这一点?或者有更好的解决方案吗?
如果有人认为我的班级设计错了请,我打开任何建议.到目前为止,我认为是正确的.是的,验证器具有特定类的特定配置.但它有抽象的原因:
ValidateMyBaseClass.Validate()一个常见的模板方法模式不是吗?nem*_*esv 12
无需深入了解所选架构的细节,只关注Windsor容器配置:
如果已将多个命名实现注册到给定接口(IValidator),则可以在使用以下命令注册使用者类(ClassA,ClassB)时指定要使用的实现ServiceOverrides:
下面容器配置提供商的OtherClass与ClassA实例与ValidatorA和ClassB实例与ValidatorB:
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>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6526 次 |
| 最近记录: |