我遇到了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包:
无论如何,感谢您花时间阅读本文以及您可以给予的任何帮助!