NInject在运行时完成后加载模块

时间:2014-01-17 15:52:22

标签: runtime ninject

我想在运行时实现后动态加载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之外发布,没有效果。

enter image description here enter image description here enter image description here enter image description here enter image description here

你能帮助我吗?

0 个答案:

没有答案