如果在创建内核后加载,则Ninject DynamicProxyModule将无法工作

时间:2016-06-10 19:59:26

标签: wpf ninject prism castle-dynamicproxy interception

我遇到了DynamicProxyModule和Ninject的问题。我想加载程序根目录中存在的所有模块(无需编写大量代码),但如果在构造Ninject内核后加载,则DynamicProxyModule不起作用 。所有其他模块似乎工作正常。我正在使用Prism for WPF,如果这有任何区别的话。这是我的代码:

public class Bootstrapper : NinjectBootstrapper
{
    protected override IKernel CreateKernel()
    {
        var ninjectSettings = new NinjectSettings { LoadExtensions = false };
        IKernel kernel = new StandardKernel(ninjectSettings);
        return kernel;
    }

    protected override void InitializeModules()
    {
        // Load modules present in all local directory dll files.
        Kernel.Load(new string[] {"*.dll"});
        // Initialize the loaded modules
        base.InitializeModules();
        // Add Service class to the IoC container
        Kernel.Bind<Service>().ToSelf();
        // Configure Ninject to intercept any call to the Service class's
        // Execute() function and replace the call with the following
        // console message
        Kernel.InterceptReplace<Service>(x => x.Execute(), invocation =>
        {
            Console.WriteLine("INTERCEPTION!");
        });
        // Now, request an instance of Service from the IoC container
        var service = Kernel.Get<Service>();
        // Call the Execute function, expecting it to be intercepted
        service.Execute();
    }

    // More stuff for the Bootstrapper
    // ... 
}

public class Service
{
    public virtual void Execute()
    {
        Console.WriteLine("Code Executed");
    }
}

拦截永远不会发生!但是,如果我将LoadExtensions更改为true并将Kernel.Load()参数更改为下面的代码,则可以正常工作。 发生了什么事?

var ninjectSettings = new NinjectSettings { LoadExtensions = true };

Kernel.Load("TestProject.*");

我的应用程序需要支持来自第三方开发人员的插件/模块,但我不知道将调用哪些dll。我可以从根目录或我创建的任何插件文件夹中获取dll名称,但我希望有一种不那么详细或更优雅的方式来做我可能错过的。

以下是我正在使用的 NuGet包

  • 带有相关Ninject包的WPF Prism(6.1.0)
  • Ninject.Extensions.Conventions(3.2.0)
  • Ninject.Extensions.Interception(3.2.0)
  • Ninject.Extensions.Interception.DynamicProxy(3.2.0)
  • Castle.Core(3.3.3)

无论如何,感谢您花时间阅读本文以及您可以给予的任何帮助!

0 个答案:

没有答案