我想在运行时实现后动态加载asp.net mvc中的模块。 所以我遵循许多教程和不同的方法来做到这一点。 最后我找到了http://www.squarewidget.com/pluggable-architecture-in-asp.net-mvc-4的解决方案。我按照描述的代码,我尝试稍后加载程序集。 我使用NInjectWebCommon.cs类 所有lib都已从bin路径项目加载。 我添加了plugin.dll:它是模块,当我尝试从它运行的模块中浏览索引页面时。
private static void RegisterServices(IKernel kernel)
{
//Func http://msdn.microsoft.com/fr-fr/library/vstudio/bb549151(v=vs.110).aspx
//Action
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin");
kernel.Bind(a => a.FromAssembliesInPath(path).SelectAllClasses().BindDefaultInterface());
}
我尝试删除plugin.dll并在主控制器上添加一个动作,允许再次调用RegisterServices,第二种方法稍作修改,允许从另一个bin加载dll => bin2我放了plugin.dll。
public static void RegisterServicesSpecific()
{
//Func http://msdn.microsoft.com/fr-fr/library/vstudio/bb549151(v=vs.110).aspx
//Action
var path = @"C:\temp\PluginASPNET\PlugMvc4\PlugMvc4\bin2";
kernel.Bind(a => a.FromAssembliesInPath(path).SelectAllClasses().BindDefaultInterface());
}
我注意到该方法已被调用,但我注意到该插件并未真正加载,因为我没有调用与AreaRegistration相关的断点。 我是ninject的新手。
[20130112]
我继续搜索,我添加方法CallMeAfterAppStart并尝试稍后从bin3加载dll。我获得的序列不包含元素....
[assembly: WebActivator.PreApplicationStartMethod(typeof(PlugMvc4.App_Start.NinjectWebCommon), "Start")]
//[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(PlugMvc4.App_Start.NinjectWebCommon), "Stop")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(PlugMvc4.App_Start.NinjectWebCommon), "CallMeAfterAppStart")]
namespace PlugMvc4.App_Start
{
using System;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
using System.IO;
using Ninject.Extensions.Conventions;
using Ninject.Extensions.Conventions.Syntax;
public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
private static StandardKernel kernel = new StandardKernel();
/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateTest);
}
private static IKernel CreateTest()
{
kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
//var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin3");
//kernel.Bind(a => a.FromAssembliesInPath(path).SelectAllClasses().BindDefaultInterface());
return kernel;
}
public static void CallMeAfterAppStart()
{
bootstrapper.Initialize(CallMeAfterAppStart2);
}
private static IKernel CallMeAfterAppStart2()
{
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin3");
kernel.Bind(a => a.FromAssembliesInPath(path).SelectAllClasses().BindDefaultInterface());
return kernel;
}
[20140121] 我从ninject和Ninject.Extensions.Conventions添加源代码并尝试调试。
我注意到指令[assembly:WebActivator.PostApplicationStartMethod(typeof(PlugMvc4.App_Start.NinjectWebCommon),“CallMeAfterAppStart”)]被调用,我可以通过调用a =&gt; FromAssembliesInPath看到插件中的dll。所以我注意到在appdomain中加载了Plugin.dll。但是在我无法访问该页面之后,似乎加载了DLL,但ASP.NET MVC不知道如何使用它。 我尝试移动AreaRegistration.RegisterAllAreas();在global.asax之外发布,没有效果。
你能帮助我吗?