ウィンザーキャッスルを使用して明示的な実装なしでインターフェイスを登録する方法はありますか。特定のケースでは実装が必要なインターフェイスがほとんどないため、アプリのオフラインモードなど他の場合には必要ありません。オフラインでは、すべてのメソッドはサポートされていない例外を投げる必要があります。したがって、代わりにすべての私のインターフェイスのためのダミーの実装を作成する、これを行うデフォルトの実装を提供する方法はありますか?Castle Windsorでのデフォルトとフォールバックの実装
答えて
あなたがしようとしていることは正しい解決策ではないと思います。そして、これをより良いやり方で実現する方法はいくつかあります。ファクトリメソッドを使用する方法について
最初のアプローチ
何? :)そのファクトリメソッドを使用して、インターフェイスの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();
}
私は現在、いくつかの場所で型付きのファクトリを使用しています。ここでは、キャッスルのデフォルトの実装を使用しています。型付きのファクトリを使用して第1のアプローチを処理することは可能ですか?私は、最初のアプローチでは、自分で工場を実装しなければならないと考えています。右? –
少し遅れますが、はい。独自のファクトリを定義する必要があります。 – Maris
私はあなたが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
- 1. Castle Windsor - インターフェイスの複数実装
- 2. Castle Windsor 1.0 RC3とCastle Windsor 2.0の違いは何ですか?
- 3. Castle Windsorインターセプターセレクターとフック
- 4. Castle Windsorはゼロ個以上の実装を解決します
- 5. Castle Windsor WCFインターセプタ
- 6. Castle Windsorフィルターオプションインストーラ
- 7. WCF Data ServiceとCastle Windsor
- 8. Castle WindsorですべてのWCFサービスの実装を登録するには
- 9. Castle Windsorコンパイル時エラー
- 10. Castle Windsor LifeStyle for WCF?
- 11. Castle Windsor Weak Typed Factory
- 12. log4net、Castle Windsor、Global.asaxのApplication_Errorメソッド
- 13. Castle Windsorの内部ログ
- 14. Silverlight 2.0用Castle MicrokernelとWindsorのコンパイル
- 15. Guice:特定の条件のデフォルト実装へのフォールバック
- 16. Castle Windsor 3 + Fluent NHibernate + Castle.NHibernate.Integration
- 17. WEB.APIとCastle Windsorコンテナを持つASP.NET MVC
- 18. History.js HTML4フォールバックの実装
- 19. MVC4のHttpClientのライフスタイル(Castle-Windsorを使用)
- 20. Windsor Castle:ドキュメント、チュートリアルの参考資料
- 21. Castle Windsor - AOP外部アプリケーションの設定
- 22. Castle Windsorでジェネリックスを解決する
- 23. Castle WindsorでEntity Frameworkを使用する
- 24. Castle Windsorと同様に、Hibernateの上に構築されたActiveRecordパターンのJava実装がありますか?
- 25. Castle Windsorとのインタフェースでオープンジェネリックタイプを登録するには?
- 26. Castle Windsorでインターフェイスのネスト実装を使用するにはどうすればよいですか?
- 27. Castle Windsor実行時に解決します
- 28. Castle Windsor複合汎用登録
- 29. Castle Windsorを使用したAOPキャッシング
- 30. カスタム.NETメンバーシップを持つCastle Windsor IOC?
だた数秒で行うことができ、手動実装のシンプルさがあなたの欲求の複雑さを打ちますの自動化。私はこの感覚に魔法にそれを解決するためのより良い方法を行うためのツールを取得しようと、あなたのデザインや、おそらくの代わりに非常に奇妙であるが、この奇妙なからくり –
、しかし、私の層の上の層は、(私がコントロールを持っていないもの)私は(私がオフラインのオリジナルデザインの絵ではなかったと信じて)オフラインモードのために実装するインタフェースのコンストラクタ・インジェクションを使用し、これらのいくつかは、オフラインで必要とされていませんが、実装なしでは、上位層は作成することさえできない。これらのサポートされていないインターフェイス上のメソッドが呼び出された場合、例外を発生させることになります。 –
を必要としないためにあなたのアプローチを検討するだろう何かを得るあなたの説明はい、それが奇数の読書 –