2016-06-30 9 views
4

私はDIとしてAutofac付きのSitecore 8.1 MVCを使用しています。私は、解決されたオブジェクトをsitecoreオブジェクト(パイプライン、コマンド、計算フィールドなど)に注入するために推奨される方法が何であるか疑問に思っていました...例として、私はビジネスレイヤを呼び出す必要のあるメンバーシッププロバイダを使用しています。私がクラスでコンストラクタを定義することは可能ですか?そして、sitecoreはオブジェクトを注入するでしょうか?基本的にはSitecore:sitecoreコンポーネントへの依存性を注入する

おかげパイプラインプロセッサ、コマンドなどのようなもので

答えて

3

...サイトコアは作成何も - あなたはかなり限られています。通常の方法は、サービスロケータパターンを使用して依存関係を解決することです。

var membershipProvider = DependencyResolver.Current.Resolve<IMembershipProvider>() 

その他の方法があります。この投稿:https://cardinalcore.co.uk/2014/07/02/sitecore-pipelines-commands-using-ioc-containers/は、コンテナファクトリクラスを使用してパイプラインの依存関係を解決します。

using System; 
using System.Diagnostics.CodeAnalysis; 

using Sitecore.Reflection; 

public class ContainerFactory : IFactory 
{ 
    private readonly IContainerManager containerManager; 

    public ContainerFactory() : this(new LocatorContainerManager()) // service locate an appropriate container 
    { 
    } 

    public ContainerFactory(IContainerManager containerManager) 
    { 
     this.containerManager = containerManager; 
    } 

    public object GetObject(string identifier) 
    { 
     Type type = Type.GetType(identifier); 
     return this.containerManager.Resolve(type); 
    } 
} 

が、これは設定でfactory属性を使用して、イベントやプロセッサのための工場としてのセットアップのようになります。これは、使用されるクラスです。例設定:

<sitecore> 
    <events> 
    <event name="item:saved"> 
     <handler factory="ContainerFactory" ref="MyApp.MyHandler, MyApp" method="MyMethod"> 
     <database>master</database> 
     </handler> 
    </event> 
    </events> 
    <pipelines> 
    <MyPipeline> 
     <processor type="1" factory="ContainerFactory" ref="MyApp.MyProcessor, MyApp" /> 
    </MyPipeline> 
    </pipelines> 
    <factories> 
    <factory id="ContainerFactory" type="MyApp.ContainerFactory"></factory> 
    </factories> 
</sitecore> 

この2番目の方法では、通常どおりに依存関係をコンストラクタに挿入できます。

これはおそらく2つの最も一般的なオプションです。

+0

サービスロケータとキャプティブの依存関係に注意してください。あなたは 'try/finally'の中でリリースをしたいでしょう –