Autofacを例として使用したMVC 3フレームワークでの依存性注入

依存性注入を使用せずにMVC3Framework上のアプリケーションを想像することは現在困難です。 この記事は、DIとは何かを知っているが、これにAutofacを使用したことがない人を対象としています。

Autofacの詳細については、 こちらをご覧ください。



まず、プロジェクトにAutofacライブラリをダウンロードして含める必要があります。 これにはNuGetを使用します。 コンソールに入力します。

PM> Install-Package Autofac



Autofac自体をインストールする

PM> Install-Package Autofac.Mvc3



およびMvc3のアドオン



NuGetビジュアルエディターを使用するか、これらのアセンブリをダウンロードして接続することもできます。

以下はAutofacを初期化するためのコードです。基本的な初期化オプションをここに含めようとしました。



 protected void Application_Start() { Trace.TraceInformation("Website initialization started"); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); // Setup IoC container var builder = new ContainerBuilder(); builder.RegisterModule(new ServicesModule()); builder.Register(c => new Entities()).As<IEntities>() .OnActivated(e => { var config = DependencyResolver.Current.GetService<IGlobalSettings>(); e.Instance.RawConnectionString = config.Data.SqlServerConnectionString; }).InstancePerHttpRequest(); builder.RegisterType<LocalizationContext>().PropertiesAutowired().InstancePerHttpRequest(); builder.Register(c => new DefaultGlobalSettings()).As<IGlobalSettings>().SingleInstance(); builder.RegisterGeneric(typeof(MongoRepository<>)) .As(typeof(IMongoRepository<>)).InstancePerHttpRequest(); builder.Register(c => EnvironmentContext()).As<IEnvironmentContext>().InstancePerHttpRequest(); builder.RegisterModule(new AutofacWebTypesModule()); builder.RegisterSource(new ViewRegistrationSource()); builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); builder.RegisterModelBinderProvider(); builder.RegisterFilterProvider(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); Trace.TraceInformation("Website has been successfully initialized"); }
      
      







ここで実際に何が起こったのか考えてみましょう。

Autofacのモジュールを登録します。 これは、別のアセンブリにあるクラス(内部アクセス修飾子を持つクラス)を初期化するのに非常に便利です。 ServicesModuleを同じアセンブリに残し、DIのすべての楽しみを使用するだけで十分です。

  builder.RegisterModule(new ServicesModule());
      
      





必要なオブジェクトを取得するために実行する必要があるメソッドは、次のように指定できます。

  builder.Register(c => EnvironmentContext()).As<IEnvironmentContext>().InstancePerHttpRequest()
      
      





匿名デリゲートと同じこと。

  builder.Register(c => new Entities()).As<IEntities>() .OnActivated(e => { var config = DependencyResolver.Current.GetService<IGlobalSettings>(); e.Instance.RawConnectionString = config.Data.SqlServerConnectionString; }).InstancePerHttpRequest();
      
      





次のように、クラスをインターフェイスにマップできます。

  builder.Register(c => new DefaultGlobalSettings()).As<IGlobalSettings>().InstancePerHttpRequest();
      
      





ジェネリッククラスを登録するには、次のコードを使用します。

  builder.RegisterGeneric(typeof(MongoRepository<>)) .As(typeof(IMongoRepository<>)).InstancePerHttpRequest();
      
      





クラスプロパティを注入するには、次の初期化を行うだけで十分です。 コンストラクターのDIは、プロパティのDIよりもはるかに高速であるため、この注入は極端な場合にのみ使用する必要があります。

  builder.RegisterType<LocalizationContext>().PropertiesAutowired().InstancePerHttpRequest();
      
      





プロパティが事前にわかっている場合は、次の初期化を使用できます。

  builder.Register(c => new LocalizationContext { GlobalSettings = c.Resolve<IGlobalSettings>() });
      
      





クラスHttpContextBase、HttpRequestBase、HttpResponseBase、HttpServerUtilityBase、HttpSessionStateBase、HttpApplicationStateBase、HttpBrowserCapabilitiesBase、HttpCachePolicyBase、VirtualPathProviderの自動形成の初期化が行われます。

  builder.RegisterModule(new AutofacWebTypesModule());
      
      





Autofacでは、ModelBinderでの注入も可能です。

  builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); builder.RegisterModelBinderProvider();
      
      





フィルター(ActionFilterAttributeから派生したクラス)への注入は、次のように行われます。

  builder.RegisterFilterProvider();
      
      





次のモジュールを登録することにより、ビューへの注入が発生します。

  builder.RegisterSource(new ViewRegistrationSource());
      
      





お気づきのように、コードの後に​​呼び出しが続きます。

.InstancePerDependency()-デフォルトで使用され、呼び出しごとに新しいオブジェクトを作成します。

.InstancePerHttpRequest()-HttpRequestの1つのインスタンス

.SingleInstance()-クラスのインスタンスを1つだけ作成します。

.InstancePerLifetimeScope()-次のように使用される特定のLifetimeScopeのインスタンスを作成します。

 using (var lifetime = container.BeginLifetimeScope()) { var component = lifetime.Resolve<SomeComponent>(); // component, and any of its disposable dependencies, will // be disposed of when the using block completes }
      
      





コンテナインスタンスを取得します。

  IContainer container = builder.Build();
      
      





DependencyResolverを設定する

  DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
      
      







以上です。 これで、autofacのスキルは最小限になり、プロジェクトで安全に使用を開始できます。 Autofacを短時間で習得するのに役立つ瞬間を正確に特定することは、私にとって非常に困難でした。 トピックを十分にカバーしていない場合は、コメントに書いてください。



All Articles