2012-07-09 59 views
1

我目前正在開發一個項目,據此我將開發將被預編譯的視圖,並將成爲外部MVC 3.0 Web解決方案的一部分,但我沒有任何控制權。從外部項目使用Ninject來解決依賴關係

我的部分要求是我需要訪問底層數據庫才能獲得一些數據。我希望使用Ninject(我已被告知這是外部解決方案使用的),以便根據需要將數據庫實例注入到控制器中。

我知道你在Global.asax這樣的地方添加綁定,但是我沒有訪問權限,因爲這是我無法控制的外部解決方案的一部分。

是否有無論如何我可以在我的項目中創建這個依賴項注入,包含預編譯視圖等,並確保它在外部項目加載我們的控制器時解決?

如果這太模糊,請告訴我,我會盡力提供更多信息。

編輯: 最初在對達林的建議採取我得到下面的異常:

System.InvalidOperationException crossed a native/managed boundary 
    Message=Sequence contains no elements 
    Source=System.Core 
    StackTrace: 
     at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
     at Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectMvcHttpApplicationPlugin.cs:line 53 
     at Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:line 52 
     at Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map[T](IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:line 32 
     at Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:line 52 
     at MyApp.App_Start.NinjectWebCommon.Start() in C:\App\NinjectWebCommon.cs:line 28 
    InnerException: 

但是在考慮這個問題,引導程序應該已經在我們的外部MVC應用程序初始化(假設他們利用這種方法我猜)。所以我不需要做所有的初始化,我需要做的就是使用當前的Kernal註冊我的依賴關係。

喜歡的東西:

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     RegisterServices(bootstrapper.Kernel); 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IDataContext>().To<ApiDataContext>(); 
    } 
} 

做這件事時我現在得到的項目注入。然而,我不是100%這是正確的解決方案,但它似乎工作?

回答

3

我知道你在這樣一個地方在Global.asax

添加綁定不一定。您最近是否在新的MVC應用程序中安裝了Ninject.MVC3 NuGet?如果你沒有,我現在邀請你這樣做。只需在Visual Studio中使用Internet應用程序模板創建一個新的ASP.NET MVC 3項目並安裝此NuGet。準備?

這樣做後,你會注意到在你的項目的App_Start文件夾中創建的NuGet包。它沒有觸及任何Global.asax。現在,讓我們檢查NinjectWebCommon.cs文件的內容添加到該文件夾​​:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MvcApplication1.App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(MvcApplication1.App_Start.NinjectWebCommon), "Stop")] 

namespace MvcApplication1.App_Start 
{ 
    using System; 
    using System.Web; 

    using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

    using Ninject; 
    using Ninject.Web.Common; 

    public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
     }   
    } 
} 

通知的WebActivator的PreApplicationStartMethodApplicationShutdownMethodAttribute裝配屬性,它們允許你插入,當ASP.NET應用程序分別啓動和關閉執行代碼。

好了,現在簡單地把這段代碼放到你的庫中,並在RegisterServices方法中配置你的內核。

+0

謝謝你,我已經完全忘記了這一點。我有它的工作,但不知道我做了什麼是正確的方式。您的體驗看起來是否可以接受?非常感謝。 – dreza 2012-07-10 09:08:26