1

私は現在、プリコンパイルされ、制御できない外部MVC3.0Webソリューションの一部となるビューを開発するプロジェクトに取り組んでいます。

私の要件の一部は、いくつかのデータを取得するために、基盤となるデータベースにアクセスする必要があるということです。必要に応じて、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%ではありませんが、これは正しい解決策ですが、うまくいくようですか?

4

1 に答える 1

3

Global.asaxなどの場所にバインディングを追加することを理解しています

必ずしも。最近、Ninject.MVC3NuGetを新しいMVCアプリケーションにインストールしましたか?まだ招待していない場合は、今すぐ招待します。VisualStudioのインターネットアプリケーションテンプレートを使用して新しいASP.NETMVC3プロジェクトを作成し、このNuGetをインストールするだけです。準備?

App_Startその後、プロジェクトのフォルダーにNuGetパッケージが作成されていることがわかります。何も触れませんでしたGlobal.asaxNinjectWebCommon.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)
        {
        }        
    }
}

ASP.NETアプリケーションがそれぞれ起動およびシャットダウンするときに実行されるコードをプラグインできるようにするWebActivatorPreApplicationStartMethodおよびアセンブリ属性に注意してください。ApplicationShutdownMethodAttribute

RegisterServices了解しました。このコードをライブラリに配置し、メソッドでカーネルを構成します。

于 2012-07-10T06:25:48.847 に答える