本文介绍了如何使用“综合设计模式";与Ninject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
验证规则合同:
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
的列表,我想获取除ValidationRuleComposite
之外的所有IValidationRule
实现.
When I ask the containter for IValidationRule
I want to get ValidationRuleComposite
. If I ask the container for a list of IValidationRule
I want to get all implementations of IValidationRule
except of the ValidationRuleComposite
.
如何使用Ninject实现这一目标?
How can I achieve this with Ninject?
推荐答案
在Soldarnal的帮助下,我得出了以下解决方案:
With the help of Soldarnal I came to the following solution:
public static class KernelExtensions
{
public static void BindComposite<TComposite, TCompositeElement>(this StandardKernel container) where TComposite : TCompositeElement
{
container.Bind(x => x.FromAssemblyContaining(typeof(TComposite))
.SelectAllClasses()
.InheritedFrom<TCompositeElement>()
.Excluding<TComposite>()
.BindAllInterfaces()
.Configure(c => c.WhenInjectedInto<TComposite>()));
container.Bind<TCompositeElement>().To<TComposite>()
.When(IsNotCompositeTarget<TComposite>);
}
private static bool IsNotCompositeTarget<TComposite>(IRequest x)
{
if (x.Target == null)
return true;
return x.Target.Member.ReflectedType != typeof(TComposite);
}
}
用法:
var container = new StandardKernel();
container.BindComposite<ValidationRuleComposite, IValidationRule>();
这篇关于如何使用“综合设计模式";与Ninject的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!