2

私はこの状況を持っています:私はWCFサービスを持っています。MyErrorHandler実装されたインターフェイスを使用して、すべての例外を処理していますIErrorHandler。作業コード全体を以下に示します。

やりたいことはあるが、方法がわからない: オブジェクト (ILogger など) をMyErrorHandlerクラスに挿入したい。これは基本的に、ここにオブジェクトを挿入する必要があることを意味します: [GlobalErrorHandlerBehaviour(typeof(MyErrorHandler))]. この問題を解決するのを手伝ってくれませんか?

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    int GetTest();
}

[GlobalErrorHandlerBehaviour(typeof(MyErrorHandler))]
public class TestService : ITestService
{
    public TestService(ILogger logger)
    {
        // Here, I'm already injecting logger. 
        // It's not imported for my question so I removed it for now
    }
    public int GetTest()
    {
       throw new Exception("Test");
    }
}

// This is attribute added to TestService class
// How can I inject (via constructor) ILogger, or any other class?? 
public class GlobalErrorHandlerBehaviourAttribute : Attribute, IServiceBehavior
{
    private readonly Type errorHandlerType;
    public GlobalErrorHandlerBehaviourAttribute(Type errorHandlerType)
    {
        this.errorHandlerType = errorHandlerType;
    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        IErrorHandler handler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);

        foreach(ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
        {
            ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
            if (channelDispatcher != null)
            {
                channelDispatcher.ErrorHandlers.Add(handler);
            }
        }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
}    

public class MyErrorHandler : IErrorHandler
{

    //--------------------------------------------------// 
    // I MUST INJECT ILOGGER HERE (or any other object) //
    //--------------------------------------------------//


    public bool HandleError(Exception error)
    {
        return true;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        FaultException fe = new FaultException();
        MessageFault message = fe.CreateMessageFault();
        fault = Message.CreateMessage(version, message, null);
    }
}

ところで。DI を使用して何かを注入したいのですが、ロガーでメソッドIErrorHandlerを使用したくありません。private static readonly

4

2 に答える 2

0

これは興味深い質問ですが、WCF では DI コンテナーのセットアップはそれほど単純ではありません。次のセットアップを実行しました。

  1. カスタム インスタンス プロバイダーを作成する
  2. カスタム サービス ホストを作成する
  3. セルフホスティングでない場合は、カスタムの ServiceHostFactory セットアップ。

WCF で DI をセットアップする方法については、MSDN の完全なコード サンプルを参照してください。DI がセットアップされたら、コンストラクター インジェクションを介して ILogger を使用するように ErrorHandler 実装を変更する必要があります。

public class MyErrorHandler : IErrorHandler
{
  private ILogger logger;
  public MyErrorHandler(ILogger logger)
   {
     this.logger = logger;
   }
}

別のタイプの DI を使用して InstanceProvider を設定するためのその他のオプションの追加ソースを次に示します。

于 2015-12-16T20:09:56.157 に答える