2012-01-13 29 views
1

まず、依存性注入は比較的新しいものです。私はUnity.MVC3を使って最初のプロジェクトを行いましたが、今は.Netプロジェクトのための最も普及している依存インジェクタと思われるので、新しいプロジェクトでNinjectに切り替えることにしたいと思います。だから私は、私のプロジェクトでNinject v2.2.1.4をNinject.MVC3 v2.2.2.0と共に使用しようとしています。私の以前のプロジェクトでNinjectとHierarchicalLifetimeManagerを持つASP.Net MVC 3プロジェクト?

私はユニティを使用していた、私は私のブートストラップクラスに次のコードのようなものを持っていた:今

private static IUnityContainer BuildUnityContainer() 
{ 
    var container = new UnityContainer(); 

    container.RegisterType<ITestService, TestService>();    
    container.RegisterType<IDatabaseFactory, DatabaseFactory>(new HierarchicalLifetimeManager()); 
    container.RegisterType<IUnitOfWork, UnitOfWork>(); 
    container.RegisterType<ILoggingService, LoggingService>(); 

    container.RegisterControllers(); 

    return container; 
} 

、私は私の新しいプロジェクトは、私は次のコードのようなものでこれを置き換えますNinjectMVC3クラス(App_Start):

​​

はしかし、私はそれが正常にHierarchicalLifetimeManagerの使用を必要とするので、私は、DatabaseFactoryが結合して何をすべきか分かりません。誰も私にDatabaseFactoryのバインディングを適切に作成する方法を教えてもらえますか?

答えて

0

まず、これらの参照先を追加して、互換性のあるパッケージがあることを確認してください。

次に、Ninject.Web.MVCを追加すると、パワーシェルスクリプトを通してプロジェクト初期化コードが設定されます。

最後に、このようなBindModuleクラスを作成し、2番目のステップで作成されたCreateKernelメソッドのモジュールに追加します。 Ninjetは、各オブジェクトごとに異なるライフサイクルの世話をするための機能が組み込まれています上記のあなたが見ることができるようにNinjectMVC3クラス

public static class NinjectMVC3 
{ 
    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var modules = new NinjectModule[] { new BindModule() }; 
     var kernel = new StandardKernel(modules); 

     RegisterServices(kernel); 

     return kernel; 
    } 
} 

public class BindModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<IControllerActivator>().To<CustomControllerActivator>().InRequestScope(); 
     this.Bind<MembaseClient>().ToMethod(context => new MembaseClient()).InSingletonScope(); 
     this.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
     this.Bind<ISessionFactory>().ToMethod(o => MyAutoMapper.sessionFactory).InSingletonScope(); 
     this.Bind<ISession>().ToMethod(o => MyAutoMapper.sessionFactory.OpenSession()).InRequestScope(); 
     } 
    } 

パート。

+0

コードサンプルと説明をありがとう!真実を伝えるために、私はまだASP.Net MVCとこれらすべてのパターンについて多くのことを学ばなければなりません。私はNugetの最新パッケージを使用していますので、バージョンは問題ありません。 BindModule.Loadオーバーライドの使用と、Ninject.MVC3によって提供されるNinjectMVC3クラスで提供されるRegisterServices()メソッドの使用の違いはありますか?ところで、MVC3用のNinject.Web.MVCパッケージはありません。 –

+0

また、HierarchicalLifetimeManagerとは何かを完全に理解していません。私はMVCについて学ぶために見たサンプルプロジェクトからそれを取り出しました。あなたはNinjectを使うときに何を置き換えるべきか教えてください。 –

+0

私はそれほど大きな違いはないと思います。モジュール化されていて、多くのプロジェクトを持っているなら、彼ら自身のNinjectModule AFAIKを持つことができますが、2番目の質問に答えるためにはわかりませんが、あなたはSingleton、InRequestScope、InThreadScopeのような上記の例を見ることができます。 –

関連する問題