同じインターフェースの2つの実装があり、ユーザーがログインしている場合はimplementation1を、ユーザーがログインしていない場合はimplementation2を使用したいと思います。Castle windor条件付き依存関係の追加
7
A
答えて
1
これを解決する方法の1つは、サービスをキーに登録し、必要に応じて解決することです。
public interface ISample
{
int Calculate(int a, int b);
}
class SampleB : ISample
{
public int Calculate(int a, int b)
{
return a + b + 10;
}
}
class SampleA : ISample
{
public int Calculate(int a, int b)
{
return a + b;
}
}
登録:
container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient);
container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient);
// SampleAが必要なときに解決します。
var sampleA = container.Resolve<ISample>("SampleA");
// SampleBが必要なときに解決します。
var sampleB = container.Resolve<ISample>("SampleB");
7
あなたが利用可能な実装は、例えば依存の間で選択することができるであろうhandler selector、追加することができますThread.CurrentPrincipal
が設定されているかどうか(正しく覚えていれば、ASP.NET/MVCではHttpContext.Current.Request.IsAuthenticated
)。
ハンドラセレクタは、おそらく多少次のようになります。ハンドラセレクタの
public class MyAuthHandlerSelector : IHandlerSelector
{
public bool HasOpinionAbout(string key, Type service)
{
return service == typeof(ITheServiceICareAbout);
}
public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
{
return IsAuthenticated
? FindHandlerForAuthenticatedUser(handlers)
: FindGuestHandler(handlers);
}
bool IsAuthenticated
{
get { return Thread.CurrentPrincipal != null; }
}
// ....
}
唯一の欠点は、それらがコンテナから引かれていないということです - 彼らは、登録時にコンテナへのインスタンスとして追加されます。すなわち彼らは従属性の注入や生活習慣の管理などをすることはありませんが、それを緩和する方法があります。その方法を知りたい場合はF.T.Windsorをご覧ください。
+1
3.0バージョンのものが変わったのかと疑問に思っています。 – Giedrius
関連する問題
- 1. Gradle - 条件付きクラスパスをビルドスクリプトの依存関係に追加
- 2. 条件付きGemspec依存関係を追加するには
- 3. gemspec内の条件付きルビの宝石の依存関係
- 4. ninjectとc#.netで条件付き依存関係注入を実装する
- 5. Djangoのモデルの条件付き関係
- 6. 条件付きJsonスキーマ - レスポンス依存
- 7. 追加の依存関係解析エラー
- 8. 追加の依存関係/ DLL /ライブラリ
- 9. Gradle:依存関係の追加
- 10. Node.jsモジュール - リンク依存関係の追加
- 11. c#追加の依存関係 - opencvsharp
- 12. 関係上のEF4条件付きマッピング
- 13. CMAKE:依存関係の依存関係を自動的に追加します
- 14. maven依存関係を追加する
- 15. Laravel条件付き関係:返品first()
- 16. 条件付きでbelongsToMany関係を保存する -
- 17. 条件付きでhas_many_through関係を保存する
- 18. 型付きイタリア語依存関係パーサー
- 19. maven添付依存関係
- 20. Scalaの条件付きセットに追加
- 21. 追加条件付きのHas_and_belongs_to_many
- 22. 条件付きでの追加Python
- 23. 依存関係の依存関係
- 24. 依存関係のプロパティ依存関係
- 25. 条件に基づいて依存関係をインストールする
- 26. gmsとFCMの依存関係を追加できません
- 27. 私のポッドに依存関係を追加できません
- 28. 条件付き手数料を追加
- 29. 追加条件付きでログインlaravel 5.3
- 30. bundleconfigに条件付きCSSを追加
ここで 'container.Resolve()'を呼び出しますか? –
内部実装を変更/拡張しない限り、ユーザーがログインしているかどうかを知る方法はありません。その間に 'ログイン・イン・ファクタ'を考慮して希望の実装を与えるDeciderクラスがあります。 –
Windsor *はこのためのメカニズムを持っています(mookidの答えを参照)、内部実装をまったく変更する必要はありません。 –