gpt4 book ai didi

c# - Ninject:通用类的默认和特定绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 21:19:29 25 4
gpt4 key购买 nike

我有一个抽象类:

 public abstract class Validator<T> : IValidator

以及一些为特定目的实现此类的类,例如

public sealed class NewsValidator : Validator<News>

现在使用 Ninject 我想像下面这样进行依赖注入(inject)(这个特定的代码不起作用):

Bind<Validator<News>>().To<NewsValidator>();
Bind(typeof(Validator<>)).To(typeof(NullValidator<>));

所以我想实现的是

Validator<News>

应该绑定(bind)到类“NewsValidator”,但是如果请求这个类的任何其他未绑定(bind)版本,比如

Validator<Article>
Validator<SomethingElse>

应该绑定(bind)到默认类 (NullValidator)。但是,使用上面使用的代码会引发异常,因为它将验证器 绑定(bind)到 NewsValidator 和 NullValidator。

我该如何实现?泛型类的特定类型应该绑定(bind)到各个类。未显式绑定(bind)的泛型类的所有其他类型都应绑定(bind)到默认类。

如果有一些建议,我会非常高兴!谢谢!

最佳答案

您可以创建 IMissingBindingResolver 的自定义实现.

每当内核无法解析所请求服务的绑定(bind)时,它就会委托(delegate)给 HandleMissingBinding方法(这适用于从 KernelBase 派生的任何内核)。 HandleMissingBinding 方法将询问每个缺少的绑定(bind)解析器是否可以为请求的服务创建绑定(bind)。解析器返回的绑定(bind)(如果有)将添加到内核中。

请注意,由缺失的绑定(bind)解析器创建的任何绑定(bind)都将作为隐式绑定(bind)添加到内核中。这可能会对您的申请产生影响。例如,如果您混合使用服务的显式和隐式绑定(bind),解析这些绑定(bind),即 kernel.GetAll<TService>() , 仅解析显式绑定(bind)。但是,如果所有绑定(bind)都是隐式的,它们都将被解析。

Ninject 有两个 IMissingBindingResolver 的标准实现:

让我们为 null 验证器实现自定义解析器。

public class MissingValidatorResolver : NinjectComponent, IMissingBindingResolver
{
public IEnumerable<IBinding> Resolve(
Multimap<Type, IBinding> bindings, IRequest request)
{
var service = request.Service;
if (!typeof(IValidator).IsAssignableFrom(service))
{
return Enumerable.Empty<IBinding>();
}

var type = service.GetGenericArguments()[0];
var validatorType = typeof(NullValidator<>).MakeGenericType(type);

var binding = new Binding(service)
{
ProviderCallback = StandardProvider.GetCreationCallback(validatorType)
};

return new[] { binding };
}
}

现在下面的测试(使用 xUnit.net )通过了。

[Fact]
public void ShouldResolveNonBoundValidatorDerivedFromValidatorAsNullValidator()
{
var kernel = new StandardKernel();
kernel.Components.Add<IMissingBindingResolver, MissingValidatorResolver>();

var validator = kernel.Get<Validator<Article>>();
Assert.IsType<NullValidator<Article>>(validator);
}

关于c# - Ninject:通用类的默认和特定绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6219560/

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