.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
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 DependencyResolver
をAutofacDependencyResolver
に と、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