.NET手記-ASP.NET MVCプログラム統合Autofac

17193 ワード

MVC


 
Autofacは常に最新バージョンのASPに追随します.NET MVCフレームワークなので、ドキュメントも常に更新されます.一般的に、異なるバージョンのフレームワークをAutofacに統合する方法は一般的に変わりません.
MVC統合にはAutofacを参照する必要がある.Mvc 5 NuGetパッケージ
MVC集積ライブラリは、コントローラ(Controller)、モデルバインディング(model binders)、動作フィルタ(action filters)、ビュー(views)への依存注入を提供する.リクエストごとのライフサイクル(per-request lifetime)のサポートも追加されました.
  • Quick Start快速開始
  • Register Controllers登録コントローラ
  • Set the Dependency Resolver設定依存解析器
  • Register Model Binders登録モデルバインダ
  • Register Web Abstractions登録ネットワーク抽象
  • Enable Property Injection for View Pagesは、ビューページへの依存注入が
  • で利用できることを保証します.
  • Enable Property Injection for Action Filtersは、動作フィルタの属性注入が
  • で利用可能であることを確認します.
  • OWIN Integration OWIN集積
  • Using"Plugin"AssembliesプラグインAssemblies
  • を使用
  • Using the Current Autofac DependencyResolver現在のAutofac依存解析器
  • を使用
  • Unit Testingユニットテスト
  • Example Implementationの例
  •  

    クイックスタートQuick Start


     
    AutofacをMVCプロジェクトに統合するには、Autofacを参照する必要があります.MVC統合ライブラリ、コントローラの登録、依存解析器の設定.他のオプションのプロパティを有効にすることもできます.
     
    protected void Application_Start()
    {
      var builder = new ContainerBuilder();
    
      // Register your MVC controllers.
      builder.RegisterControllers(typeof(MvcApplication).Assembly);
    
      // OPTIONAL: Register model binders that require DI.
      builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
      builder.RegisterModelBinderProvider();
    
      // OPTIONAL: Register web abstractions like HttpContextBase.
      builder.RegisterModule<AutofacWebTypesModule>();
    
      // OPTIONAL: Enable property injection in view pages.
      builder.RegisterSource(new ViewRegistrationSource());
    
      // OPTIONAL: Enable property injection into action filters.
      builder.RegisterFilterProvider();
    
      // Set the dependency resolver to be Autofac.
      var container = builder.Build();
      DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
     
    次のセクションでは、これらの特性のさらなる詳細と使用方法について説明します.
     

    コントローラRegister Controlの登録


     
    アプリケーションの起動時に、自分のコンテナを構築するときも、すべてのコントローラと依存項目を登録する必要があります.これは通常、典型的なOWIN起動クラスまたはGlobal.asax  Application_Start で する.
     
    var builder = new ContainerBuilder();
    
    // You can register controllers all at once using assembly scanning...
    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    
    // ...or you can register individual controlllers manually.
    builder.RegisterType<HomeController>().InstancePerRequest();
     
    、ASP.NET MVCは、エンティティタイプによりコントローラインスタンスを するため、As()として することはできない.また、コントローラを で し、カスタムライフサイクルを する は、InstancePerDependency()またはInstancePerRequest()- , ,ASP.NET MVC に する があります.
     

    Set the Dependency Resolverの


     
    を する 、AutofacDependencyResolver の に する. DependencyResolver.SetResolverを いるASPを する.NET MVCはAutofacDependencyResolver (Service)を すべきであることを っている.これはIDependencyResolverインタフェースのAutofac である.
     
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
     

    モデルバインダーRegister Model Bindersの


     
    できるオプションのステップは、モデルバインドへの を することです. コントローラと に、モデルバインディング(IModelBinderインタフェースの クラス)は、アプリケーションの にコンテナに できます.RegisterModelBinders()メソッドを して、このようにすることができます.RegisterModelBinderProvider() メソッドを してAutofacModelBinderProviderを することも えておいてください.これはIModelBinderProviderインタフェースのAutofac です.
     
    builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
    builder.RegisterModelBinderProvider();
     
    RegisterModelBinders()メソッドでは、 (Assembly)スキャンを してモデルバインダーを するため、モデルバインダーを するタイプを する があります.
    Autofac.Integration.Mvc.ModelBinderTypeプロパティラベルでは、 のように します.
     
    [ModelBinderType(typeof(string))]
    public class StringBinder : IModelBinder
    {
      public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
      {
        // Implementation here
      }
    }
     
    のタイプのモデルバインダーとして する は、クラスに のModelBinderTypeAttributeラベルを できます.
     

    ネットワーク Register Web Abstractions


     
    MVC ライブラリは、ネットワーク クラスにHTTP ライフサイクルドメインの を できるAutofacモジュールを む.これにより、ネットワークをクラスの として し、 に の しい (Value)を することができます.
     
    これには、 の クラスが まれます.
     
  • HttpContextBase
  • HttpRequestBase
  • HttpResponseBase
  • HttpServerUtilityBase
  • HttpSessionStateBase
  • HttpApplicationStateBase
  • HttpBrowserCapabilitiesBase
  • HttpFileCollectionBase
  • RequestContext
  • HttpCachePolicyBase
  • VirtualPathProvider
  • UrlHelper
  • これらの クラスを するには、 のRegisterModule()メソッドを してAutofacWebTypesModuleをコンテナに します.
     
    builder.RegisterModule<AutofacWebTypesModule>();
     
     

    ビューページのプロパティがEnable Property Injection for View Pagesに されていることを します。


     
    アプリケーションコンテナを する に、ContainerBuilderにView RegistrationSourceを することで、ビューページで を できます.
     
    builder.RegisterSource(new ViewRegistrationSource());
     
    ビューページには、ビューを するためのMVCのベースクラスを する があります.Razorビューエンジンを する 、このときのベースクラスはWebViewPageクラスを します.
     
    public abstract class CustomViewPage : WebViewPage
    {
      public IDependency Dependency { get; set; }
    }
     
    Web formエンジンを する 、サポートされるベースクラスはViewPage、ViewMasterPage、およびViewUserControlです.
     
    public abstract class CustomViewPage : ViewPage
    {
      public IDependency Dependency { get; set; }
    }
     
    のビューページがカスタムベースクラスに されていることを します.Razorビューエンジンでは、 できます.cshtmlファイルでは@Inheritsを いて する.
     
    @inherits Example.Views.Shared.CustomViewPage
     
    Web Formエンジンを する は、aspxファイルの@PageにInheritsプロパティを して します.
     
    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="Example.Views.Shared.CustomViewPage"%>
     
    ASP.NET MVC の は,Razor Layoutページでは は できない.Razorビューでは できますが、レイアウトページでは できません.
     

    テキストフィルタの にEntle Property Injection for Action Filtersが されていることを します。


     
    フィルタ に を できるようにするには、コンテナを してAutofacDependencyResolverに する にContainerBuilderのRegisterFilterProvider()メソッドを び す があります.
     
    builder.RegisterFilterProvider();
     
    これにより、コンテナに されている する がこれらの に されると に、フィルタに を できます.
    たとえば、 の フィルタには、コンテナから されたILoggerインスタンスがあります(ILoggerコンポーネントを したと します).コンテナに する はありません.
     
    public class CustomActionFilter : ActionFilterAttribute
    {
      public ILogger Logger { get; set; }
    
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
        Logger.Log("OnActionExecuting");
      }
    }
     
    じ は、 フィルタなどの のタイプのフィルタで できます.
     
    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
      public ILogger Logger { get; set; }
    
      protected override bool AuthorizeCore(HttpContextBase httpContext)
      {
        Logger.Log("AuthorizeCore");
        return true;
      }
    }
     
    フィルタをactionに すると、 のように します.
     
    [CustomActionFilter]
    [CustomAuthorizeAttribute]
    public ActionResult Index()
    {
    }
     
     

    OWIN OWIN Integration


     
    OWINプログラムの としてMVCを している は、 のことをする があります.
  • すべての MVC ステップ-コントローラの 、 の など
  • Autofac OWIN を してアプリケーションを します.
  • Autofacに する Mvc5.Owinパッケージの
  • アプリケーション クラスでは、 Autofacミドルウェアを した 、Autofac MVCミドルウェアを します.
  •  
     
    public class Startup
    {
      public void Configuration(IAppBuilder app)
      {
        var builder = new ContainerBuilder();
    
        // STANDARD MVC SETUP:
    
        // Register your MVC controllers.
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
    
        // Run other optional steps, like registering model binders,
        // web abstractions, etc., then set the dependency resolver
        // to be Autofac.
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    
        // OWIN MVC SETUP:
    
        // Register the Autofac middleware FIRST, then the Autofac MVC middleware.
        app.UseAutofacMiddleware(container);
        app.UseAutofacMvc();
      }
    }
     
     

    「プラグイン」コレクションUsing「Plugin」Assembliesの


     
     
    プラグインのセットにメインプログラムで するコントローラがあるかどうかは、ASPを する があります.NET BuildManagerはコントローラのプラグインセットを します.
    このステップは、プロファイルまたはプログラミングによって できます.
    プロファイルを する は、/configuration/system.web/compilation/assembliesのリストにプラグインセットを する があります.プラグインセットがbinフォルダにない は、/configuration/runtime/assemblyBinding/probingパスを する があります.
     
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <!--
              If you put your plugin in a folder that isn't bin, add it to the probing path
          -->
          <probing privatePath="bin;bin\plugins" />
        </assemblyBinding>
      </runtime>
      <system.web>
        <compilation>
          <assemblies>
            <add assembly="The.Name.Of.Your.Plugin.Assembly.Here" />
          </assemblies>
        </compilation>
      </system.web>
    </configuration>
     
    プログラミングを して する は、アプリケーションの で する があります.BuildManager を してコレクションスキャン/ロードを する クラスを します.
     
    using System.IO;
    using System.Reflection;
    using System.Web.Compilation;
    
    namespace MyNamespace
    {
      public static class Initializer
      {
        public static void Initialize()
        {
          var pluginFolder = new DirectoryInfo(HostingEnvironment.MapPath("~/plugins"));
          var pluginAssemblies = pluginFolder.GetFiles("*.dll", SearchOption.AllDirectories);
          foreach (var pluginAssemblyFile in pluginAssemblyFiles)
          {
            var asm = Assembly.LoadFrom(pluginAssemblyFile.FullName);
            BuildManager.AddReferencedAssembly(asm);
          }
        }
      }
    }
     
    に、 プロパティを してプリスタートコードを します.
     
    [assembly: PreApplicationStartMethod(typeof(Initializer), "Initialize")]
     

    のAutofac Using the Current Autofac DependencyResolverの


    MVC DependencyResolverAutofacDependencyResolverに と、AutofacDependencyResolver.Currentを の を するためのショートカットとして し、AutofacDependencyResolver として することができます.
    なことに、AutofacDependencyResolver.Currentを すると、 くのトラップが し、いくつかのものが に しない があります. 、これらの はGlimpseやCastle DynamicProxyのような によって します. を するには、 りたたむ があります(パッケージ?)または を します. の が またはエージェントされている 、AutofacDependencyResolverとして することはできません. の を る もありません.
    Autofac MVC ライブラリバージョン3.3.3の に、 ライフサイクルドメインに を に することで します.エージェントから り すことができないAutofacDependencyResolver  を することができますしかし、これはAutofacDependencyResolver.Currentが ライフサイクルドメインでのみ することを する-バックグラウンドタスクやアプリケーションの に することはできません.
    バージョン3.3.3が されたとき、AutofacDependencyResolver.Currentの は、 の を に するように された.そして、Castle DynamicProxyを する りたたむ を しながら、 によって りたたみを する.しかし...AutofacDependencyResolverが つからないので、 の を げました.
    The dependency resolver is of type ‘Some.Other.DependencyResolver’ but was expected to be of type ‘Autofac.Integration.Mvc.AutofacDependencyResolver’. It also does not appear to be wrapped using DynamicProxy from the Castle Project. This issue could be the result of a change in the DynamicProxy implementation or the use of a different proxy library to wrap the dependency resolver.
    も な はContainerBuilder.RegisterFilterProvider() (action filter provider)を するときです.フィルタプロバイダは、 にアクセスする があり、AutofacDependencyResolver.Currentを いて することができる.
    これらを たら、 り めない で していることを します(または に しますか?) は、AutofacDependencyResolver.Currentに する が する. のソリューションは / されませんか?
     

    ユニットテストユニットTesting


     
    InstancePerRequestコンポーネントを するASP.NET MVCアプリケーションがユニットテストを うと、そのインスタンスを しようとすると が げ されます.これは,セルテスト にHTTPリクエストがないためである.
    ライフサイクルドメイン(per-request lifetime scope)を するたびに、このトピックでは、per-request-scopeコンポーネントのテストのポリシーについて した.
     
     

    Example Implementationの


     
    AutofacソースコードにはRememberというWebアプリケーションの が まれています.Web.Autofacを いたMVCへの を した.
    プロジェクトのアドレス:https://github.com/autofac/Autofac