ASP.NET MVCでアプリケーションを開発する際にUnityなどのDIコンテナを用いることがよくあると思います。
Sitecore MVCでも同様にDIコンテナを利用できないか調べてみました。
今回はUnityを利用した実装の例を紹介したいと思います。
まずはDependencyResolverの実装です。
SitecoreではデフォルトでDIコンテナが実装されており、そのままDIコンテナを差し替えてしまうと基本機能が動作しなくなってしまいます。
そこで、DependencyResolverの実装でUnityのDIコンテナでサービスが取得できない場合、SitecoreのDIコンテナへ続けてサービスの取得へ行くように実装をしています。
(ちなみに私が過去にDIコンテナをそのまま差し替えた場合、WFFM(Web Form For Marketers)モジュールが読み込めなくてエラーになっていました。)
namespace Example.DependencyResolvers
{
public class ChainedMvcResolver : IDependencyResolver
{
IDependencyResolver _fallbackResolver;
IDependencyResolver _newResolver;
public ChainedMvcResolver(IDependencyResolver newResolver, IDependencyResolver fallbackResolver)
{
_newResolver = newResolver;
_fallbackResolver = fallbackResolver;
}
public object GetService(Type serviceType)
{
object result = null;
try
{
result = _newResolver.GetService(serviceType);
}
catch (ResolutionFailedException e)
{
result = _fallbackResolver.GetService(serviceType);
}
return result;
}
public IEnumerable<object> GetServices(Type serviceType)
{
IEnumerable<object> result = null;
try
{
result = _newResolver.GetServices(serviceType);
}
catch(ResolutionFailedException e)
{
result = _fallbackResolver.GetServices(serviceType);
}
return result;
}
}
}
次に作成したDependencyResolverを登録する箇所の実装です。
var unityResolver = new UnityDependencyResolver(UnityConfig.Container);
var sitecoreResolver = System.Web.Mvc.DependencyResolver.Current;
DependencyResolver.SetResolver(new ChainedMvcResolver(unityResolver, sitecoreResolver));
上記のような実装をすることでSitecoreの基本機能を維持したまま、DIコンテナを共存させることができ、UnityでDIを行うことができるようになります。
public class ExampleClass
{
[Dependency]
public IExampleLogic ExampleLogic { get; set; }
// 省略
}
【参考情報】
SitecoreのデフォルトDIについて
Dependency injection - Sitecore Documentation
Unity DIコンテナ
Unity Container · GitHub
実装の参考にしたサイト
Adventures in Dependency Injection with Sitecore 8.1 - JocksToTheCore
※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。