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 的基本了解让我偶然发现了以下内容:

  • Application是一个接口,就像它的 base 一样_Application。尽管如此,还是可以调用它的构造函数。为什么?

  • 我告诉 Ninject 使用工厂方法,当依赖项位于定义内核的程序集中时,这似乎可以工作。为什么当它位于另一个程序集中时,它会尝试通过自绑定来解决依赖项?

4

1 回答 1

1

Application 是一个接口,就像它的基础 _Application 一样。尽管如此,还是可以调用它的构造函数。为什么?

这是一个编译器技巧;有关正在发生的事情的信息,请参阅在 C# 中创建接口实例。当您在代码中遇到它时,它肯定看起来很奇怪。不幸的是,目前无法帮助您解决问题的实际 Ninject 部分。

于 2012-12-01T11:51:51.310 回答