---
title: "依存注入"
slug: "dependency-injection"
abstract: "Sitecoreがどのように依存性注入をサポートしているかを説明します"
---
# 依存注入

依存注入(DI)は、オブジェクトとそのコラボレータ、すなわち依存関係との間に緩やかな結合を実現する技術です。ココラボレーターを直接インスタンス化したり、静的参照を用いたりするのではなく、クラスがアクションを実行するために必要なオブジェクトを何らかの形でクラスに提供します。多くの場合、クラスはコンストラクタを通じて依存関係を宣言します。Sitecoreはこのアプローチのみをサポートしており、これをコンストラクタ注入として知られています。

SitecoreにおけるDI実装は、Microsoft.を基にしています [。拡張。依存注入](https://github.com/aspnet/DependencyInjection)ASP.NET Coreからの抽象化。

## サービス登録

抽象化は設定上かコードで登録できます。

### 構成上の登録

Sitecoreのインクルード設定ファイル内のサービスノードで抽象化を設定できます。例えば:

<configuration>
 <sitecore>
 <services>
 <register serviceType="IMyService, MyAbstraction.Assembly" implementationType="MyServiceImplementation, MyImplementation.Assembly" />
 <register serviceType="MyServiceBase, MyAbstraction.Assembly" implementationType="MyServiceBaseImplementation, MyImplementation.Assembly" />
 </services>
 </sitecore>
</configuration>

### コードでの登録

IServicesConfiguratorインターフェースを使ってコードからサービスを設定します。例えば:

-   IServicesConfiguratorインターフェースの実装:
    
    public class MyServicesConfigurator : IServicesConfigurator
     {
     public void Configure(IServiceCollection serviceCollection)
     {
     serviceCollection.AddScoped(typeof(IMyService), typeof(MyServiceImplementation));
     serviceCollection.AddTransient(typeof(MyServiceBase), typeof(MyServiceBaseImplementation));
     }
    }
    
    IServiceServiceCollectionの詳細はMSDNのウェブサイトでご覧いただけます。
    
-   コンフィギュレーターを登録する:
    
    <configuration>
     <sitecore>
     <services>
     <configurator type= "MyServicesConfigurator, MyAssembly"/>
     </services>
     </sitecore>
    </configuration>

## サービス期間

MSDNのウェブサイトで、サービス期間および登録オプションに関する重要な情報をお読みください。

リクエストライフタイムごとのスコープドをサポートするために、httpモジュールにSitecore.DependencyInjection.SitecorePerRequestScopeModule, Sitecore.Kernelが追加されました。モジュールが無効化されている場合、Scopedはシングルトンと同じ動作を示します。

## サービス解決

このセクションでは、サービスロケーターを使ってDIを通じて登録サービスを解決(検索)する方法について説明します。

### Factoryによって作成された型への注入

resolve属性を使用する必要があります。以下の変更により、shutdownパイプラインのShowReasonプロセッサへの注入が可能になります。

<shutdown>
 <processor type="Sitecore.Pipelines.Shutdown.ShowReason, Sitecore.Kernel" resolve="true"/> </shutdown>

### 注入とMVC

デフォルトでは、Sitecore MVCは依存性注入のSitecore実装を使用しています。現在のトピックで説明されているようにコントローラとその依存関係を設定し、両方をレジスタすることを忘れないでください。

### WebFormsおよびUserControlsへの注入

フォームとユーザーコントロールにはSitecore.DependencyInjection.AllowDependencyInjection属性を使いましょう:

Sitecore.DependencyInjection.AllowDependencyInjection
public partial class Default : System.Web.UI.Page
{
 protected Default() // important
 {
 }
 public Default(IMyService myService, MyServiceBase serviceBase)
 {
 …
 }
}

フォームにはデフォルトのコンストラクタも必要です(これはASP.NETの制限です)。

### サービスロケーター

現在、Sitecoreのすべての部分で依存注入を使うことは不可能なので、サービスロケーターが唯一の解決策となる場合もあります。例えば、ページハンドラーファクトリー、MVCコントローラーファクトリー、そして後方互換性のためのスタティックマネージャーで見られます。

したがって、Sitecore.DependencyInjection.ServiceLocatorクラスを使用できます。例えば:

var service = ServiceLocator.ServiceProvider.GetService(typeof(IMyService))

例えば:

var service = ServiceLocator.ServiceProvider.GetService<MyServiceBase>();

## 依存注入構成を見る

依存注入の詳細はこのURLで確認できます:http://instance/sitecore/admin/showservicesconfig.aspx。

設定されたサービス(ノードサービス)は以下のURLで確認できます:http://instance/sitecore/admin/showconfig.aspx。