Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject:默认值&;泛型类的特定绑定_C#_Asp.net Mvc 3_Ninject_Ninject 2 - Fatal编程技术网

C# Ninject:默认值&;泛型类的特定绑定

C# Ninject:默认值&;泛型类的特定绑定,c#,asp.net-mvc-3,ninject,ninject-2,C#,Asp.net Mvc 3,Ninject,Ninject 2,我有一个抽象类: public abstract class Validator<T> : IValidator 公共抽象类验证器:IValidator 还有几个类,它们为特定目的实现了这个类,例如 public sealed class NewsValidator : Validator<News> 公共密封类NewsValidator:验证程序 现在使用Ninject,我想像下面这样进行依赖项注入(这段特定代码不起作用): Bind().To(); 绑定(t

我有一个抽象类:

 public abstract class Validator<T> : IValidator
公共抽象类验证器:IValidator
还有几个类,它们为特定目的实现了这个类,例如

public sealed class NewsValidator : Validator<News>
公共密封类NewsValidator:验证程序
现在使用Ninject,我想像下面这样进行依赖项注入(这段特定代码不起作用):

Bind().To();
绑定(typeof(Validator))。到(typeof(NullValidator));
所以我想要实现的是

Validator<News>
验证程序
应该绑定到类“NewsValidator”,但如果请求该类的任何其他未绑定版本,则

Validator<Article>
Validator<SomethingElse>
验证程序
验证器
应该绑定到默认类(NullValidator)。但是,使用上面使用的代码会引发一个异常,因为它将验证器绑定到newsvalidater和NullValidator

我如何实现这一点?泛型类的特定类型应该绑定到单个类。未显式绑定的泛型类的所有其他类型都应绑定到默认类


我真的很高兴有几个建议!谢谢

您可以创建的自定义实现

每当内核无法解析所请求服务的绑定时,它就会委托给该方法(对于派生自该方法的任何内核都是如此)。HandleMissingBinding方法将询问每个缺少的绑定解析程序是否可以为请求的服务创建绑定。解析程序返回的绑定(如果有)将添加到内核中

请注意,丢失的绑定解析程序创建的任何绑定都将作为隐式绑定添加到内核中。这可能对你的申请有影响。例如,如果服务混合了显式绑定和隐式绑定,则解析这些绑定(即
kernel.GetAll()
)只解析显式绑定。但是,如果所有绑定都是隐式的,那么它们都将被解析

Ninject有两个IMissingBindingResolver的标准实现:

让我们为空验证器实现一个自定义解析器

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 };
    }
}
公共类MissingValidatorResolver:NinjectComponent,IMissingBindingResolver
{
公信力(
多映射绑定,IRequest请求)
{
var service=request.service;
如果(!typeof(IValidator).IsAssignableFrom(服务))
{
返回可枚举的.Empty();
}
var type=service.GetGenericArguments()[0];
var validatorType=typeof(NullValidator);
var binding=新绑定(服务)
{
ProviderCallback=StandardProvider.GetCreationCallback(validatorType)
};
返回新的[]{binding};
}
}
现在,以下测试(使用)通过

[事实]
public void应该ResolveNonBoundValidatorDerivedFromValidatorAsNullValidator()
{
var kernel=新的标准内核();
cornel.Components.Add();
var validator=kernel.Get();
IsType(验证器);
}
whoa:)难以置信,这台机器工作起来很有魅力。你怎么知道的?!即使是谷歌在搜索“IMissingBindingResolver”时也没有找到太多。无论如何,那绝对是完美的,非常感谢!!
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 };
    }
}
[Fact]
public void ShouldResolveNonBoundValidatorDerivedFromValidatorAsNullValidator()
{
    var kernel = new StandardKernel();
    kernel.Components.Add<IMissingBindingResolver, MissingValidatorResolver>();

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