私は現在、プリコンパイルされ、制御できない外部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%ではありませんが、これは正しい解決策ですが、うまくいくようですか?