1

別の電信式の質問です。まず、私の NinjectModule:

using Ninject.Modules;
using Microsoft.Office.Interop.Word;

namespace NinjectSample.Util.Injection
{
    public class SampleModule : NinjectModule
    {
        public override void Load()
        {
            Bind<_Application>().ToMethod(ctx => GetApp());
        }

        public _Application GetApp()
        {
            return new Application();
        }
    }
}

最初に(動作します!):

        IKernel kernel = new StandardKernel(new SampleModule());
        var foo = kernel.Get<_Application>();

これを

        IKernel kernel = new StandardKernel(new SampleModule());
        var foo = kernel.Get<BusinessClass>();

BusinessClass別のアセンブリ、コードで定義されています:

namespace BusinessClassLibrary
{
    public class BusinessClass
    {
        private _Application _app;

        [Inject]
        public BusinessClass(_Application application)
        {
            _app = application;
        }
    }
}

これにより、次の結果が得られます。

Error activating _Application
No matching bindings are available, and the type is not self-bindable.
Activation path:
  2) Injection of dependency _Application into parameter application of constructor of type BusinessClass
  1) Request for BusinessClass

Suggestions:
  1) Ensure that you have defined a binding for _Application.
  2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
  3) Ensure you have not accidentally created more than one kernel.
  4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
  5) If you are using automatic module loading, ensure the search path and filters are correct.

私は相互運用性についてあまり深くは知りませんが、.Net の基本的な理解から、次のことに遭遇することができます。

  • Applicationbase と同じようにインターフェース_Applicationです。それでも、そのコンストラクターを呼び出すことは可能です。なんで?

  • Ninject にファクトリ メソッドを使用するように指示します。これは、依存関係がカーネルが定義されているアセンブリにある場合に機能するようです。依存関係が別のアセンブリにある場合、自己バインディングによって依存関係を解決しようとするのはなぜですか?

4

1 に答える 1

1

アプリケーションは、そのベース_Applicationと同じようにインターフェースです。それにもかかわらず、そのコンストラクターを呼び出すことは可能です。なんで?

これはコンパイラのトリックです。何が起こっているかについては、C#でのインターフェイスのインスタンスの作成を参照してください。コードで遭遇すると、間違いなく奇妙に見えます。残念ながら、現時点では質問の実際のNinject部分についてはお役に立てません。

于 2012-12-01T11:51:51.310 に答える