【问题标题】:NInject binding generic interface to its implementations for each type parameterNInject 将泛型接口绑定到每个类型参数的实现
【发布时间】:2018-07-20 03:50:25
【问题描述】:

我将通用接口绑定到它的实现:

class Program
{
    static void Main(string[] args)
    {
        IKernel kernel = new StandardKernel();

        kernel.Bind<ICreator<bool>>().To<BoolCreator>().InSingletonScope();
        kernel.Bind<ICreator<int>>().To<IntCreator>().InSingletonScope();
        kernel.Bind<ICreator<string>>().To<StringCreator>().InSingletonScope();

        Console.WriteLine(kernel.Get<ICreator<bool>>().Create());
        Console.WriteLine(kernel.Get<ICreator<int>>().Create());
        Console.WriteLine(kernel.Get<ICreator<string>>().Create());
    }
}

interface ICreator<T>
{
    T Create();
}

class BoolCreator : ICreator<bool>
{
    public bool Create() => true;
}

class IntCreator : ICreator<int>
{
    public int Create() => 123;
}

class StringCreator : ICreator<string>
{
    public string Create() => "abc";
}

添加新类时,还必须手动绑定。有没有办法自动绑定?我试过这个:

        kernel.Bind(scanner => scanner
            .FromThisAssembly()
            .SelectAllClasses()
            .InheritedFrom(typeof(ICreator<>))
            .BindSingleInterface()
            .Configure(b => b.InSingletonScope()));

但它不起作用。

谢谢。

【问题讨论】:

    标签: c# .net dependency-injection inversion-of-control ninject


    【解决方案1】:

    基于约定的绑定仅适用于公共类型。默认情况下,您的类型是内部的,因为它们没有访问修饰符。将它们公开,您的绑定将起作用。

    【讨论】: