3

(Ninject 3+) の Ninject.Extensions.Conventions を機能させようとしていますが、運がありません。見つかったサンプル コンソール アプリにまで煮詰めましたが、それを実行することさえできません。ここに私が持っているものがあります:

 class Program
    {
        static void Main(string[] args)
        {
            var kernel = new StandardKernel();
            kernel.Bind(x => x
               .FromThisAssembly()
               .SelectAllClasses()
               .BindAllInterfaces());

            var output = kernel.Get<IConsoleOutput>();
            output.HelloWorld();

            var service = kernel.Get<Service>();
            service.OutputToConsole();

            Console.ReadLine();
        }

        public interface IConsoleOutput
        {
            void HelloWorld();
        }

        public class ConsoleOutput : IConsoleOutput
        {
            public void HelloWorld()
            {
                Console.WriteLine("Hello world!");
            }
        }

        public class Service
        {
            private readonly IConsoleOutput _output;
            public Service(IConsoleOutput output)
            {
                _output = output;
            }

            public void OutputToConsole()
            {
                _output.HelloWorld();
            }
        }
    }

FromAssembliesMatchingSelectAllTypesBindDefaultInterfacesなどのさまざまな組み合わせも試しました 。すべてが Error activate をスローします。一致するバインディングは利用できず、タイプは自己バインディング可能ではありません。

正気を保つために、手動バインディングを行う場合:

kernel.Bind<IConsoleOutput>().To<ConsoleOutput>();

すべてがうまく機能します。明らかに、何かが足りないだけです。

4

1 に答える 1

8

サムが示唆したように、タイプが公開されていないことが原因です。それらは、非公開の「Program」クラスの内部型です。

プログラムを公開するか、次を追加し.IncludingNonPublicTypes()ます。

kernel.Bind(x => x
    .FromThisAssembly()
    .IncludingNonPublicTypes()
    .SelectAllClasses()
    .BindAllInterfaces());

(どちらかが機能することを確認しましたが、コードは機能しません)。

そして、ここにあなたの公式ソースがあります: https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions.Test/IntegrationTests/NonPublicTypesTests.cs

注: Ninject の古いバージョンでは、このメソッドはIncludeNonePublicTypes(None vs Non) と呼ばれていました。

于 2013-09-18T14:33:01.707 に答える