gpt4 book ai didi

c# - 如何在 Ninject 中使用 "Composite Design Pattern"

转载 作者:行者123 更新时间:2023-11-30 14:28:43 25 4
gpt4 key购买 nike

验证规则合约:

public interface IValidationRule
{
bool IsValid();
}

具体验证规则:

public class MyClass : IValidationRule
{
public bool IsValid()
{
return true;
}
}

复合:

public class ValidationRuleComposite : IValidationRule
{
private readonly IEnumerable<IValidationRule> _validationRules;

public ValidationRuleComposite(IEnumerable<IValidationRule> validationRules)
{
_validationRules = validationRules;
}

public bool IsValid()
{
return _validationRules.All(x => x.IsValid());
}
}

当我向容器询问 IValidationRule 时,我想得到 ValidationRuleComposite。如果我向容器询问 IValidationRule 的列表,我想获取 IValidationRule 的所有实现,ValidationRuleComposite 除外。

我如何使用 Ninject 实现这一目标?

最佳答案

首先,您要为将注入(inject)组合的 IEnumerable 设置绑定(bind)。您可以单独绑定(bind)它们:

// Bind all the individual rules for injection into the composite
kernel.Bind<IValidationRule>().To<MyClass>().WhenInjectedInto<ValidationRuleComposite>();
kernel.Bind<IValidationRule>().To<RuleTwo>().WhenInjectedInto<ValidationRuleComposite>();

或者您也可以使用 convention binding extensions 相当简单地设置 IEnumerable ,这样您就不必为每个单独的具体规则添加单独的绑定(bind)。只需确保为复合类添加 Exlcuding 子句,如下所示:

using Ninject.Extensions.Conventions;

// Bind all the non-composite IValidationRules for injection into ValidationRuleComposite
kernel.Bind(x => x.FromAssemblyContaining(typeof(ValidationRuleComposite))
.SelectAllClasses()
.InheritedFrom<IValidationRule>()
.Excluding<ValidationRuleComposite>()
.BindAllInterfaces()
.Configure(c => c.WhenInjectedInto<ValidationRuleComposite>()));

在我的示例中,复合 Material 和其余混凝土位于同一个程序集中,但显然,如果它们位于其他地方,您可以改变约定绑定(bind)。

最后,我们需要设置绑定(bind),以便在其他任何地方请求 IValidationRule,Ninject 提供复合。似乎没有一个优雅的方法来解决这个问题,所以我写了自己的 When 子句来避免循环注入(inject):

// Now bind the composite to the interface for everywhere except itself
kernel.Bind<IValidationRule>().To<ValidationRuleComposite>()
.When(x => x.Target == null
|| x.Target.Member.ReflectedType != typeof(ValidationRuleComposite));

关于c# - 如何在 Ninject 中使用 "Composite Design Pattern",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28692658/

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