問題タブ [simple-injector]
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.
entity-framework - クラスライブラリにコンテナ(IoC)を登録しますか?
次のセクションでn層アプリケーションを作成しています。
- MyApp.DAL-データアクセス層(EF 5、SQLバックエンド)
- MyApp.BLL-ビジネスレイヤー
- MyApp.WcfService-サービスレイヤー
- MyApp.WpfClient-フロントエンド
- MyApp.Modelsは、すべてのPOCOを保持する共有プロジェクトです。
各レイヤーの「Country」エンティティの例を示します。最初はモデルです。StatefulObjectは、切断されたクライアントからのエンティティの状態を追跡するのに役立つことに注意してください(JuliaLernerのプログラミングEF第2版第18章による)。
DALには、ICountryRepository(基本的なCRUD)とCountryRepositoryがあります。これがコンストラクターです。
私のBLLには、次のようなICountryLogic、CountryLogic、IBusinessLayer、およびBusinessLayerがあります。
次に、新しいビジネスレイヤーをインスタンス化し、次のような操作を実行するサービスメソッドの例を示します。
次に、WPFクライアントは次のようにサービスを使用できます。
さて、BLLとWPFフロントエンドの間にWCFサービスを配置する前に、私のWPFフロントエンドは依存性注入を使用することができ、この醜さはありませんでした。
代わりに、次のようにDIとコンストラクターインジェクションを使用します。
次に、インターフェイスと実装をWPFのコンテナーに登録するだけです。私の質問は、それらをクラスライブラリ(BLL内)に登録するにはどうすればよいですか?クラスライブラリにはコンポジションルートまたはエントリポイントがないため、その方法がわかりません。SimpleInjectorを使用しています。
または、WcfサービスでDIを使用することもできますが、ICountryRepositoryをCountryRepositoryに登録できるように、サービスにDALへの参照が必要になります。これは正しくないようです。サービスレイヤーはBLLのみを参照する必要があるため、BLLにDIを設定する必要があります。ありがとう。
c# - Simple Injector を使用してオープン汎用シングルトンを登録する
以下のコードがあり、ジェネリックの異なるバリアントごとにシングルトンを登録したいと考えています。これは可能ですか?現在、同じオブジェクト タイプではないため、アサーションは失敗します。
c# - UnityとSimpleInjectorのIoC登録の違い
Unityを使用して完全に機能しているプロジェクトが1つあります。代わりにSimpleInjectorを使用するように切り替えてみましたが、データベースに変更が保存されることはありません。登録されているコンポーネントの寿命に関係していると思います。Unityコンテナの登録は次のとおりです。
そして、これが新しいSimpleInjectorの登録です。
SimpleInjectorでどのように機能するのかわかりませんHttpContextLifetimeManager
。MVCはユニティの例のクライアントですが、私はWPFプロジェクトとSimpleInjectorに変更しています。どんな提案でも大歓迎です。ありがとう。
@スティーブン。ご意見ありがとうございます。私のRepositoryBaseとUnitOfWorkは、コンストラクターにIDatabaseFactoryを挿入するので、使用する必要があることを発見しましたcontainer.RegisterSingle<IDatabaseFactory, DatabaseFactory>()
。これにより、1つの問題が解決しました。私はまだ生涯に問題があります。消費するアプリはWPFですが、RegisterPerWebRequestはどのように機能しますか?
私のプロジェクトには、DataLayer >> BusinessLayer >> WcfService>>WPFフロントエンドがあります。Simple InjectorはWcfServiceプロジェクトに設定されており、ビジネスレイヤーにはそこにアイテムを登録するためのBoostrapperがあります。今のところ、私のWPFクライアントはGetAllCountries()を実行し、グリッドに表示します。名前を変更して更新しようとすると、「同じキーを持つオブジェクトがObjectStateManagerにすでに存在します。ObjectStateManagerは同じキーを持つ複数のオブジェクトを追跡できません。」というメッセージが表示されます。エラー。デバッグを行ったところ、WPFクライアントでGetCountriesサービスを呼び出した後、更新を試みると、すべての国がdbContext.ChangeTracker.Entries()を介してコンテキストに接続されていることがわかりました。この時点では、最初の作業単位の後にコンテキストが破棄されているはずなので、追跡されているエンティティはありません。
MVCアプリでは、RegisterPerWebRequestがそれを修正しますが、WPFに相当するものは何ですか?今から拡張機能をインストールして試してみますが、探している解決策ではないと感じています。助けてくれてありがとう。
わかった。私はもう少し掘り下げて、うまくいく解決策を見つけました。それが正しいかどうかはわかりません。とにかく、今、物事を登録するためのブートストラッパーがある私のBLLでは、次のように登録できます。
それは私が探していたものを私に与えます。DatabaseFactoryのインスタンスは1つしか作成されないため、私のリポジトリと作業単位は、必要に応じてそれを共有します。また、クライアントでGetCountries()を実行した後、サービスを2回呼び出して実行および更新するときに、dbContext.ChangeTracker.Entries()を確認し、追跡されているエンティティがないことを確認します。これは正しいことです。これで、重複キーエラーが発生することなく、アタッチ、変更の設定、およびSaveChangesの呼び出しを行うことができます。これは大丈夫ですか?ありがとう。
c# - SimpleInjectorには、RegisterManyForOpenGeneric / GetAllInstancesを使用するときに優先順位を割り当てる機能がありますか?
SimpleInjectorをIoCコンテナとして使用しています。パブリッシュ/サブスクライブフレームワークを作成しました。サブスクライバーが実行の優先順位を指定できるようにすることで、このフレームワークを改良できるようにする必要があります。たとえば、トランザクションの残りの部分に必要なすべてのデータをプリロードするためのサブスクライバーを作成できます。
私が考えることができる1つの方法は[SubscriberPriority]
、登録プロセス中に要件を示す属性を作成することですRegisterManyForOpenGeneric
が、まだ深く掘り下げていません。
GetAllInstances
登録を返す注文を管理する方法はありますか?
アップデート:
私が今考えたもう1つのオプションは、CoC(設定より規約)を使用して、によって返されるインスタンスを注文することGetAllInstances
です。
c# - SimpleInjectorは、Webリクエストごとのライフスタイルとライフスタイルの範囲を混合します
Simple InjectorをIoCコンテナーとして使用しており、次の手法を使用して、Webリクエストごとまたはスレッドごとの両方で一部のオブジェクトの「混合」ライフスタイルを登録できるようにしています。
私はこのソリューションに完全に満足しているわけではありません。各要件について、それを機能させるために追加の空のインターフェイスを定義し、それらが私の具象クラスによって参照されるようにする必要があります。
追加のインターフェイスを定義する代わりに、次の拡張メソッドを使用しない理由はありますか?これらのメソッドに問題がある場合、コンテナーの現在のインスタンスがIIS内で実行されていることを完全に確信して確立する他の方法はありますか?
アップデート
上記の質問とそれに続く質問は、SimpleInjectorとハイブリッド登録の誤解に基づいていました。上記およびSOの他の場所で説明されている手法は、コンテナーがWeb要求とWeb要求のコンテキスト内で実行されていないバックグラウンドプロセスの両方の要求を処理できる場合に使用されます。私が達成しようとしているのは、Webリクエストとスレッドリクエストの両方に適したコンテナの構成に対応するための変数登録です。つまり、IIS内で機能し、Windowsサービス内で機能するようにコンテナーを構成する必要があります。両方に同時に対応できる動的登録は必要ありません。
この結果は次の拡張メソッドであり、ソリューションから「余分な」インターフェイスを削除しました:-)
c# - SimpleInjectorハイブリッド登録が必要になるのはいつですか?(IISでホストされているオブジェクトをHttpContextなしで呼び出すにはどうすればよいですか?)
SimpleInjectorとハイブリッドWebリクエスト/スレッドのライフスタイルに関する最近の質問に続いて、私は技術的な要件を完全に理解しておらず、実際には必要のないことを行っているようです。
このコードで
私の理解では、IIS内で実行されているAppDomainのIWebUnitOfWork
場合はが返されます。そうでない場合は、LifetimeScopeのインスタンスを明示的に宣言してコンテナーへの呼び出しをラップしない限りエラーが発生します(これにより)が返されIThreadUnitOfWork
ます。
次の声明は、私が何をしているかを完全には理解していないことに気づきました!
ただし、すべてを追加するハイブリッドライフスタイルは必要ないようです。ハイブリッドライフスタイルは、動的に(GetInstanceの呼び出しごとおよびインジェクションごとに)切り替えることができるライフスタイルですが、起動時に切り替える必要があるだけのようです。
私の質問はこれです:IIS内で実行されているAppDomain内にロードされたコンテナ(またはその他のクラス)は、静的またはインスタンスであり、HttpContextが存在しなくても呼び出すことができますか?
c# - Migration Ninject-> Simple Injector
Ninject
プロジェクトで使用していますが、パフォーマンスに問題があります。同じプロジェクトをでテストするのは興味深いでしょうSimple Injector
。
移行を容易にするガイドを知っていますか?
c# - 呼び出しチェーン内の同じデコレータに対する複数の登録
依存性注入に SimpleInjector を使用していますが、単一の呼び出しチェーン内で同じデコレーターを複数回登録でき、要求された構成に従ってデコレーターが適用されることを発見しました。たとえば、RepositoryTraceDecorator をリポジトリ クラスの最初と最後のデコレータとして挿入できます。
これは仕様によるものなので、この機能に依存できますか?
c# - simpleinjectorを使用してopengenericを登録する
私は以下のクラスを持っています:
SubIdentifierItemCreateCommandHandler
タイプのサービスのリクエストを処理するには、シングルトンオープンジェネリックとして
登録する必要がありますIDbCommandHandler<SubIdentifierItemCreateCommand<,>,>
。
これは可能ですか?私はさまざまな方法で試しましたが、常にエラーが発生します。
私は以下に電話して仕事ができるようになりたいです:
c# - Simple InjectorabdWebFormsMVPを使用してランタイム値をコンストラクターに渡します
SimpleInjectorをWebFormsMvpと組み合わせようとしています。
DIを容易にするために、WebFormsMvpはIPresenterFactory
インターフェースを提供します。
これには、解決するプレゼンタータイプとビューインスタンスCreate
を提供するメソッドが含まれています。ビューインスタンスをプレゼンターのコンストラクターに挿入する
必要があります。
プレゼンターには、コンテナーによる作成が必要な他の依存関係もあります。
これは私がこれまでに得たものですが、理想的ではありません。問題の正しい解決策
は
何ですか?
プレゼンターコンストラクター:
工場: