2016-12-16 7 views
0

SharePointでホストされる部分とプロバイダでホストされる部分を持つSharePointアドインを開発しています。私のプロバイダがホストする部分には、TaxonomyやSearchのようなものをインストールするサービスがいくつかあります。私はこれにC#CSOMを使用します。これは、プロバイダがホストするパートの唯一の目的です。アドインがインストールされると、AppInstalled Event Triggersがリモートイベント受信者を呼び出します。このリモートイベント受信者は、次にWCFサービスを1つずつ呼び出す必要があります。パラメータ付きのWCFサービスを呼び出す

は今私の実際の質問に:私は現在、私のサービスを消費するため、このアプローチを使用します。

var taxBinding = new BasicHttpBinding(); 
var taxEndpoint = new EndpointAddress(remoteUrl.ToString() + "/Services/TaxonomySetupService.svc"); 
var taxChannelFactory = new ChannelFactory<ISetupService>(taxBinding, taxEndpoint); 

ISetupService taxClient = null; 

try 
{ 
    taxClient = taxChannelFactory.CreateChannel(); 
    taxClient.SetAppWebUrl(appWebUrl.ToString()); 
    if (!taxClient.IsInstalled()) 
     taxClient.Install(); 
    string logs = taxClient.GetLogs(); 

    ((ICommunicationObject)taxClient).Close(); 
} 
catch (Exception ex) 
{ 
    if (taxClient != null) 
    { 
     ((ICommunicationObject)taxClient).Abort(); 
    } 
} 

ISetupService:

[ServiceContract] 
public interface ISetupService 
{ 
    string OpenText { get; } 
    string DoneText { get; } 
    string AppWebUrl { get; set; } 

    [OperationContract] 
    bool IsInstalled(); 

    [OperationContract] 
    void SetLogComponent(LogList logList); 

    [OperationContract] 
    void SetAppWebUrl(string url); 

    [OperationContract] 
    void WriteToLog(string message); 

    [OperationContract] 
    string GetLogs(); 

    [OperationContract] 
    void Install();   
} 

私のソリューションは、そう私はかかわらず、このアプローチに従う必要はありません。より良いものを探しています。具体的には、ClientContextオブジェクトをISetupServiceコンストラクタに渡す必要があります。ここで最も簡単なアプローチは何ですか?

+0

あなたは解決しようとしていることの具体的なことができますか? – jtabuloc

+0

私はhttp://stackoverflow.com/questions/21623432/how-to-pass-multiple-parameter-in-wcf-restful-serviceに似たものを探しています。私のパラメータをコンストラクタに渡したいだけです。方法ではありません。 – LeonidasFett

答えて

0

オプション1 - レイジー注入可能なプロパティ なぜコンストラクタ内にありますか?レイジー注入可能なプロパティを持っていないのはなぜですか?

internal IClientContext Context 
{ 
    get { return _Context ?? (_Context = SomeStaticHelper.Context); } 
    set { _Context = value; } // Allows for replacing IContext for unit tests 
} private IClientContext _Context; 

public class SomeStaticHelper 
{ 
    public static IContext Context { get; set; } // Set this in global.asax 
} 
  • プロ:いいえ、追加のライブラリ
  • プロ:あなたの(InternalsVisibleToを使用)
  • コン簡単にユニットテストでIコンテキストを置き換えることができます。クラスをコンパイルするためにSomeStaticHelperに結合されています。
  • Con:1つのクラスでこれを行うのはいいですが、100クラスでこれを行うのはうまくありません。

オプション2 - 依存性注入 それともなどAutofacとしてまっすぐに依存性の注入を、使用することができます。 http://docs.autofac.org/en/latest/getting-started/

  • プロ:クラスが切り離され、依存関係が注入されます。
  • Pro:依存関係注入を必要とするクラスがたくさんある場合は、オーバーヘッドがすべてのクラスファイルのプロパティではなくいくつかのクラスファイルになっているため、これが行われます。
  • Con:コードにフレームワークを追加する必要があります。
  • Con:依存性注入を設定するためのコードやその他のオブジェクトが必要になりました。

依存性注入をほとんど必要としない小さなプロジェクトでは、オプション1を使用します。私はこれがここで最も簡単なアプローチだと思います。

DIを常時使用する大規模プロジェクトでは、オプション2を使用します。

+0

私は月曜日に仕事に戻り、フィードバックを提供するときにこれを試してみます。あきらめて、壊れた男に家に帰った。 :) – LeonidasFett

関連する問題