0

Entity Framework 4、Ninject 3、MVC3 現在、私の Web アプリでは、オブジェクト コンテキストのリクエストごとのインスタンス化に対してかなり初歩的なアプローチを使用しています。だから私はNinjectといくつかの古いサンプルコードを試していますが、次のことを進める方法がわかりません..事実上、コントローラーで同等のことを実行できるようにしたい: DB_Entities.Current.Albums ...毎回 StandardKernel をインスタンス化していますか? 私が見ていたサンプルは、以下を使用していました: MvcApplication.Container.Get(); しかし、App_Startフックアップを備えたNinject 3では、コンテナにアクセスできません..

上記の行を複製しようとすると、実行時に失敗します。

using MusicStoreEntities;
using Ninject;
using TestMVC3WithIOC.App_Start;
using System.Data.Objects;

namespace TestMVC3WithIOC.Models
{
    public partial class MusicStoreEntities
    {
        public static MusicStoreEntities Current
        {
        get
        {
            using (IKernel kernel = new StandardKernel())
            {
            return (MusicStoreEntities)kernel.Get<ObjectContext>();
            }
        }
        }
    }
}

また、App_Start\NinjectWebCommon.cs に次の変更があることに注意してください。

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ILogger>().To<NLogger>();
        kernel.Bind<ObjectContext>().To<MusicStoreEntities>().InRequestScope();

    } 
4

1 に答える 1

0

実行可能な解決策ですが、カーネル全体をクラスに渡すことはお勧めできません。クラスの実際の特定の依存関係がわかりにくくなる傾向があるためです。より良いアプローチは、ファクトリの依存関係をコントローラーのコンストラクターに渡すことです。

public partial class MusicStoreEntities
{
    private readonly IEntitiesFactory _factory;

    public MusicStoreEntities(IEntitiesFactory factory)
    {
        _factory = factory;
    }
}

IEntitiesFactory単一のメソッドで簡単に実装できGetObjectContext()ます。


(「Unit of Work」パターンも現在人気があると思いますが、私はそれを使用していないので、実際には話せません。調べる価値があるかもしれません。)

于 2012-11-13T17:30:08.747 に答える