2017-01-24 7 views
1

ウィンザーキャッスルを使用して明示的な実装なしでインターフェイスを登録する方法はありますか。特定のケースでは実装が必要なインターフェイスがほとんどないため、アプリのオフラインモードなど他の場合には必要ありません。オフラインでは、すべてのメソッドはサポートされていない例外を投げる必要があります。したがって、代わりにすべての私のインターフェイスのためのダミーの実装を作成する、これを行うデフォルトの実装を提供する方法はありますか?Castle Windsorでのデフォルトとフォールバックの実装

+1

だた数秒で行うことができ、手動実装のシンプルさがあなたの欲求の複雑さを打ちますの自動化。私はこの感覚に魔法にそれを解決するためのより良い方法を行うためのツールを取得しようと、あなたのデザインや、おそらくの代わりに非常に奇妙であるが、この奇妙なからくり –

+1

、しかし、私の層の上の層は、(私がコントロールを持っていないもの)私は(私がオフラインのオリジナルデザインの絵ではなかったと信じて)オフラインモードのために実装するインタフェースのコンストラクタ・インジェクションを使用し、これらのいくつかは、オフラインで必要とされていませんが、実装なしでは、上位層は作成することさえできない。これらのサポートされていないインターフェイス上のメソッドが呼び出された場合、例外を発生させることになります。 –

+0

を必要としないためにあなたのアプローチを検討するだろう何かを得るあなたの説明はい、それが奇数の読書 –

答えて

1

あなたがしようとしていることは正しい解決策ではないと思います。そして、これをより良いやり方で実現する方法はいくつかあります。ファクトリメソッドを使用する方法について

最初のアプローチ

何? :)そのファクトリメソッドを使用して、インターフェイスのimplを解決することができます。例えば:その場合は

T Create<T>(ModeEnum mode): where T:YourInterface{ if(mode==ModeEnum.Offline){ throw ApplicationOfflineException(); } return instance; // Create somehow instance of a class }

、代わりに実行時に新しいタイプを構築するには、アプリがオフラインのときにそのタイプを解決するから防ぐことができます。

このアプローチでは、たとえば、何らかの種類の属性を持つすべてのクラス/インターフェイス(たとえばOnlyOnline)をマークすることができます。また、現在のモードがオフラインで、解決しようとしているタイプがApplicationOfflineExceptionをスローするよりも属性[OnlyOnline]を持っている場合。

第二のアプローチ

あなたは城の動的プロキシを使用することができます。 Castle Dynamic ProxyはAOP機能を提供します。つまり、IoCコンテナを使用して解決されたクラスの各メソッドを実行する前に、ある種のロジックを実行できます。詳細:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<PreventOfflineInterceptor>()); 
     container.Register(
      Classes.FromThisAssembly() 
       .BasedOn<IMyClass>() 
       .WithServiceAllInterfaces() 
       .Configure(c => c.Interceptors<PreventOfflineInterceptor>()) 
       .LifestyleTransient() 
      ); 
     container.Resolve<IMyClass>().MyMethod(); 
    } 


} 
public class PreventOfflineInterceptor : IInterceptor 
{ 
    public bool IsOffline 
    { 
     get 
     { 
      // Get somehow information about mode, is it offline 
      return true; 
     } 
    } 

    public void Intercept(IInvocation invocation) 
    { 
     // If the app is not offline lets run the method otherwise throw an exception 
     if (IsOffline) 
     { 
      throw new NotImplementedException(); 
     } 

     invocation.Proceed(); 
    } 
} 
public class MyClass : IMyClass 
{ 
    public void MyMethod() 
    { 
     Console.WriteLine("MyMethod()"); 
    } 
} 

public interface IMyClass 
{ 
    void MyMethod(); 
} 
+0

私は現在、いくつかの場所で型付きのファクトリを使用しています。ここでは、キャッスルのデフォルトの実装を使用しています。型付きのファクトリを使用して第1のアプローチを処理することは可能ですか?私は、最初のアプローチでは、自分で工場を実装しなければならないと考えています。右? –

+0

少し遅れますが、はい。独自のファクトリを定義する必要があります。 – Maris

0

私はあなたがIHandlerSelectorを探していると思う:ここ https://github.com/castleproject/Core/blob/master/docs/dynamicproxy.md

はあなたのために動作するはずコンソールアプリケーションを使用して構築されたCDPインターセプターの一例です。これにより、解決するコンポーネントを条件付きで選択することができます。それでは、コンポーネントを見つけるにはどうしたらよいでしょうか?

Ayendeは、昔からの資料では、このhttps://ayende.com/blog/3633/windsor-ihandlerselector

を実装する方法を説明すると、ここではより多くの最近の記事http://www.longest.io/2015/03/13/select-between-components-castle-windsor.html

関連する問題