問題タブ [ninject-2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ASP.NET MVC 3:継承/ポリモーフィズムを備えたDefaultModelBinder
まず、大きな投稿(最初にいくつかの調査を試みました)と同じ質問に関するテクノロジの組み合わせ(ASP.NET MVC 3、Ninject、およびMvcContrib)について申し訳ありません。
一部のクライアントの注文を処理するために、ASP.NETMVC3を使用してプロジェクトを開発しています。
つまり、抽象クラスから継承されたオブジェクトがいくつかOrder
あり、コントローラーに対してPOSTリクエストが行われたときにそれらを解析する必要があります。正しいタイプを解決するにはどうすればよいですか?クラスをオーバーライドする必要がありますDefaultModelBinder
か、それともこれを行う他の方法がありますか?誰かが私にこれを行う方法に関するいくつかのコードまたは他のリンクを提供できますか?どんな助けでも素晴らしいでしょう!投稿がわかりにくい場合は、明確にするために変更を加えることができます。
したがって、処理する必要のある注文に対して、次の継承ツリーがあります。
このクラスはすべてEntityFrameworkによって生成されるため、モデルを更新する必要があるため、変更しません(拡張できることはわかっています)。また、より多くの注文がありますが、すべてがから派生していOrder
ます。
注文を作成するための汎用ビュー( )があり、このビューは、継承された注文(この場合はと)Create.aspx
ごとに強く型付けされた部分ビューを呼び出します。クラスでGETリクエスト用のメソッドとPOSTリクエスト用のメソッドを定義しました。2番目は次のようなものです。OrderBottling
OrderFinishing
Create()
OrderController
ここで問題があります。フォームからのデータを含むPOSTリクエストを受信すると、MVCのデフォルトのバインダーがオブジェクトをインスタンス化しようとしますOrder
。これは、メソッドのタイプがそれであるため問題ありません。しかし、Order
は抽象的であるため、インスタンス化することはできません。
質問:Order
ビューによって送信された具体的なタイプをどのように見つけることができますか?
私はすでにStackOverflowでここを検索し、これについて多くのことをグーグルで検索し(私はこの問題に約3日間取り組んでいます!)、いくつかの同様の問題を解決するいくつかの方法を見つけましたが、私の本当のようなものは見つかりませんでした問題。これを解決するための2つのオプション:
- ASP.NET MVC
DefaultModelBinder
をオーバーライドし、ダイレクトインジェクションを使用してOrder
;がどのタイプであるかを検出します。 - 注文ごとにメソッドを作成します(美しくなく、維持するのに問題があります)。
問題を解決する正しい方法ではないと思うので、2番目のオプションは試していません。最初のオプションでは、注文のタイプを解決してインスタンス化するためにNinjectを試しました。私のNinjectモジュールは次のようなものです。
NinjectのGet<>()
メソッドを使用して、タイプの1つを取得しようとしましたが、タイプを解決する方法は1つではないことがわかります。そのため、モジュールが適切に実装されていないことを理解しています。私も両方のタイプにこのように実装しようとしました:Bind<Order>().To<OrderBottling>().WithPropertyInject("OrderTypeId", 2);
、しかしそれは同じ問題を抱えています...このモジュールを実装する正しい方法は何でしょうか?
また、MvcContribモデルバインダーを使用してみました。私はこれをしました:
そしてGlobal.asax.cs
私はこれをしました:
ただし、これにより例外がスローされます。System.MissingMethodException:抽象クラスを作成できません。したがって、バインダーが正しいタイプに解決されないか、解決できないと思います。
よろしくお願いします!
編集:まず第一に、あなたの答えをマーティンとジェイソンに感謝し、遅れて申し訳ありません!私は両方のアプローチを試しましたが、両方ともうまくいきました!マーティンの答えはより柔軟で、私のプロジェクトのニーズのいくつかを満たしているので、正しいとマークしました。具体的には、各リクエストのIDはデータベースに保存されており、IDを1か所(データベースまたはクラス)でのみ変更すると、それらをクラスに配置するとソフトウェアが破損する可能性があります。マーティンのアプローチは、その点で非常に柔軟です。
@Martin:私のコードで行を変更しました
に
私のクラスは別のプロジェクト(そして別のアセンブリ)にあるからです。これを共有しているのは、外部アセンブリの型を解決できない実行中のアセンブリのみを取得するよりも柔軟性があるように見えるためです。私の場合、すべての注文クラスは同じアセンブリにあります。それは良くも魔法の公式でもありませんが、これを共有するのは面白いと思います;)
asp.net-mvc - NinjectとDependencyResolverを使用してASP.NETMVC3でブートストラッパーを作成する
単純なブートストラッパーを作成しようとしています。私のブーストラッパーコードは次のようになります。
IBootstrapperTaskインターフェイスは次のようになります。
私の最初の試みは、ブートストラッパーを介してルートを登録することでした。
私のglobal.asaxは次のようになります。
そして、私のNinjectDependencyResolverは次のようになります。
ただし、このコードを実行しようとすると、次の例外が発生します。
VirtualPathProviderのアクティブ化中にエラーが発生しました一致するバインディングが利用できず、タイプは自己バインドできません。
アクティベーションパス:
3)タイプRouteCollectionのコンストラクターのパラメーターvirtualPathProviderへの依存性VirtualPathProviderの注入
2)タイプRegisterRoutesのコンストラクターのパラメータールートへの依存性RouteCollectionの注入
1)IBootstrapperTaskのリクエスト
どんな助けでも大歓迎です。
編集
私の例が機能するために必要な欠落しているバインディングは次のとおりです。
Ninject MVC拡張機能を使用する場合、このバインディングは必要ありません。これは、以下の回答に従って、このバインディングと他のいくつかのバインディングがすでに含まれているためです。
ninject - NinjectがWCFでコンストラクター引数を使用して新しいインスタンスを作成しない
これがシナリオです。このサービスが呼び出されると、別のクラスのインスタンス (Ninject を介して作成) に制御が渡されます。そのクラスでは、特に Entity Framework とリポジトリを使用して、いくつかの作業を行う必要があります。簡単に言うと、次のバインディングを宣言しています。
このリポジトリを使用したいときは、次のものがあります。
問題は、まったく新しいリクエストの場合に genericProductRepository の新しいインスタンスしか取得できないことです。メソッドが同じリクエストで複数回呼び出された場合、コンテキスト (EF コンテキスト) が既に破棄されていることを示すエラーが表示されます。これはusing ステートメントで既に破棄されているのと同じインスタンスを取得しているように見えるためです。別の言い方をすると、Microsoft WCF テスト クライアントを使用して、初めて呼び出した場合、コードは正常に実行されます。呼び出しボタンをもう一度押すと (テスト クライアントを再起動せずに、つまり同じ要求)、このエラーがスローされます。すでに処分されていることについて。
Ninject に付属するさまざまな「スコープ」をいじってみましたが、明らかに何かが欠けています。
私の基本的な質問は、同じものを使用する代わりに、その行にヒットするたびに新しいリポジトリを取得するにはどうすればよいですか? 助けていただければ幸いです。私は会社に Ninject を採用し、Spring を廃止するよう強く求めています。
c# - 内部クラスは構築後に依存関係を作成する必要があるが、IoC コンテナーを 1 か所に保持する方法
この比較的小さなプロジェクトで Ninject の使用を開始しましたが、問題が発生しました:私はこのクラスを持っています
それはに依存します
それは次に依存します
これにDataRepository
は、次のような ctor があります。
BizEntityModel
ここで、複数のインスタンスにわたって単一のインスタンスを使用できるようにする必要がありIDataRepository
ます。また、 の寿命に沿って
を作成する必要があります。はNinjectについて知らないので、そのままにしておきたいです。IDataRepository
IBizLogicModule
IBizLogicModule
だから私の問題は: Ninject カーネルを使用して、すべてを接続する方法です:
レイヤー間でカーネル インスタンスを渡す必要はありません。
以前のNinjectに近いコードを読みやすいままにします(私はファクトリメソッドを使用して新しくしただけです)。
これまでに得た配線の簡単な部分は次のとおりです。
ご指導よろしくお願いします
編集:あなたの答えをありがとう!
リクエストされたデータは次のとおりです:
BizEntityModel
Ninject に登録されています (コードが更新されました)。
私が正しく理解していれば、「ファクトリーメソッド」を使用してIDataRepository
inのインスタンスを作成できます。IBizLogicModule
しかし、それは私に次のことを残します:
1)ファクトリーメソッドにaを渡す必要がありBizEntityModel
ます。場合によってはそのふすまが新しく、場合によっては既存のインスタンスです。ファクトリ メソッドを使用すると、毎回新しく作成されます。
2)これは別のアセンブリにある問題でSomeService
あり、Ninject.dll への参照があるだけですか?
c#-4.0 - NinjectModuleで呼び出されるメソッドにインジェクションを提供する方法
私は次のNinjectModule
派生クラスを持っています:
私の問題は、拡張メソッドIKernel
が公開されていないことです。.Get<T>
これを行うためのパターンはありますか?
警告:クラスをNinject属性で装飾する必要はありません。これは、このモジュールで保持されるように、すべてのコードがその作成でAdd
どのように機能するかを特定するためです。MainClass
TIA
ninject - インスタンスを作成せずに、指定されたタイプのバインディングを確認する方法をninjectで利用できます
したがって、モジュールをテストしようとしているだけです。通常は、指定されたモジュールでカーネルを作成してからインスタンスを取得しようとしますが、このシナリオにはいくつかのモジュールが含まれており、特定のモジュールが特定のバインディング (つまり、実装およびインターフェース) へのアクセス
クラスのインスタンスを作成せずに、特定のタイプのバインディングが利用可能かどうかを確認する方法はありますか (つまり、それらの依存関係があることを確認する必要はありません)。
c# - インジェクト属性がフィールドで機能しない
インジェクト属性がフィールドに対して機能していません。
デフォルトのNinject設定を使用しています。なぜフィールドが注入されないのですか?
asp.net-mvc - Ninject を使用してリポジトリをカスタム メンバーシップ プロバイダーに注入する
MVC 3 で ninject を使用してカスタム メンバーシップ プロバイダーにリポジトリを注入しようとしています。
MembershipProvider では、次のことを試しました。
と
私のninjectモジュールでは、次のことを試しました:
上記のいずれも機能しません。
私が使用するとき(global.asaで)
一緒に
動作しますが、ライフサイクル管理がなく、NHibernate から「ISession が開いています」というエラーが発生します。これは、ISession が InRequestScope であり、リポジトリがそうでないためです。
c# - この DI を実行する方法がわかりません
わかりました、私は完全なばかのように感じます。私はドキュメントを読みましたが、まだこれを Ninject で動作させることはできません。
ご覧のとおり、上記のクラスのコンストラクターを注入する必要があります。うーん、なかなか進まない。ヘルプ!!perl コードの作成に戻る前に。冗談!笑
皆さん、どう思いますか?
asp.net-mvc-3 - コントローラ内のインターフェイスの数を最小限に抑える必要がありますか?
以下のスニップには、3 つのインターフェイスを使用するコントローラーがあります。これらはNinject経由で配線されています。間違いなく正しい方向への一歩です。私の質問はこれですか?
1.) 3 つのインターフェイスを 1 つのインターフェイスにラップし、そのように実装して、コントローラーの ctor に渡されるパラメーターの量を減らす方がよいでしょうか? 2.) そのままにしておくと、機能していますか?
私は常に、あらゆるものから地獄を抽象化する方法を探しています。
}