SITECORE MANIA 技術ブログ

2019.06.30 コードサンプル

小嶋

小嶋

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

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

お問い合わせ・資料請求

LYZONにご相談下さい

ご依頼ご質問等まずは私達にお気軽にご相談下さい。

お電話でのお問い合わせ

03-5803-0587平日9:00~18:00