SITECORE MANIA 開発者向け技術ブログ

コードサンプル

LYZON編集部

LYZON編集部

Sitecore(サイトコア)でUnity(DI Container)を利用する方法

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のバージョンによって実装されている機能が異なります。

この記事を読んだ人はこちらの記事も読んでます

Sitecore導入に関するご相談・資料ダウンロード

導入をご検討・ご依頼の方や、サービスについてご不明点がございましたらお気軽にお問い合わせください。

Sitecoreの運用問題を解決する

既にSitecoreを導入しているお客様向けサービス