問題タブ [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.
mapping - IMappingEngine (AutoMapper) を登録するシンプルなインジェクター
以前は Autofac を使用していましたが、SimpleInjector を試してみたいと思います。私の問題は、メソッド内で mappingEngine を呼び出すと、次のエラーが発生することです。
タイプ マップ構成が欠落しているか、サポートされていないマッピングです。
マッピング タイプ: Something -> SomethingDto 宛先パス: IEnumerable`1[0]
ソース値:
Mapper.Map は私が望むものではありません。ここに基づいてAutomapperを登録しています:
私の質問は、IMappingEngine を SimpleInjector に登録し、プロファイルを正しく追加するにはどうすればよいですか?
前もって感謝します!
mtraxに挨拶
.net - SimpleInjectorでデータベース接続エラーを処理するための構造
別のボックスでSQLサーバーに接続するEntityFrameworkアプリケーションがあります。プログラムフローは、次の2つの状態に分類できます。
- SimpleInjectorDIフレームワークを使用してコンポジションルートとレジスタタイプを初期化します
- Initアプリケーション(Entity Frameworkを使用してSQLデータベースで読み取りと書き込みを行います)
- タイマーに基づいて、タスク関数は実行予定のコマンドのインスタンスを取得します
ICommandHandler<CommandType>
(コマンドタイプは異なります) Handle(commandType)
このインスタンスを呼び出してコマンドを実行します- 手順3に戻ります
SQLサーバーへの接続が失われた場合にプログラムがクラッシュしないように保護する必要があります。現在、アプリケーションがSQL接続を失うと、未処理の例外がスローされEntityException - The underlying provider failed on Open
ます。
サーバーがオンラインに戻ると、プログラムはリセットして操作を再開できるはずです。
この質問には、アプリケーションのコアであるSimple Injectorの使用が含まれます。初期化されていない状態と実行中の状態の間の状態遷移を記述することについていくつかのアイデアがありますが、最初に、 Simple Injectorの機能-特に私はデコレータに焦点を当てていますが、これが正しいかどうかはわかりません。
他の推奨アーキテクチャを公開し、エラーがより高いレベルでキャッチされて状態の変化が発生する場所からこれがどのように見えるかを確認します。
以下のコード構造
私はコマンド/ハンドラーアプローチを使用しています:
アプリケーションの起動時に、実装するすべてのタイプICommandHandler<T>
が登録されます。
私のコマンドハンドラーの実装は次のとおりです。
次に、Simple Injectorを使用して、タイプのインスタンスを取得できます。たとえば、ICommandHandler<AddBusinessUnitCommand>
インスタンス化されたBusinessUnitCommandHandlers
オブジェクトが返されHandle()
、コマンドを実行できるようになります。
Handle()
Simple Injectorは、プロシージャ呼び出しをラップするために使用できるデコレータを使用できることを確認しました。
dependency-injection - 単純なインジェクター ASP.NET MVC 投稿フォームの結果エラー
私は単純なインジェクターを初めて使用し、codeplex と nuget パッケージのガイドで説明されているようにすべてのインスタンスを登録します。リンクをクリックすると、フォームバック結果のないアクションに関連するすべてが正常に機能します。
いくつかのデータが入力されたフォームがあり、送信ボタンがクリックされた後、get メソッドまたは post メソッドに対して、コンテナが初期化されていないなどのエラーが発生します。
「このオブジェクトにはパラメーターなしのコンストラクターが定義されていません。」
なぜこれが起こったのか理解できません。
.net - SimpleInjector のジェネリック型制約に基づくコマンド デコレーターの条件付き登録
に条件付きデコレータを登録する方法はSimpleInjector
? ここに私の定義があります:
そして、私はしようとしています:
dependency-injection - SimpleInjector-すべてのインターフェースのタイプを登録します
実装しているすべてのインターフェースに型を登録することは可能ですか?例:私は:
c# - シンプルなインジェクターを使用したスレッドごととWebごとのリクエストの混合ライフスタイル
SimpleInjector
IoCライブラリとして使用しています。DbContext
Webリクエストに従って登録しましたが、正常に機能します。しかし、バックグラウンドスレッドで実行するタスクが1つあります。DbContext
そのため、インスタンスの作成に問題があります。例えば
Service1
のインスタンスがありますDbContext
Service2
のインスタンスがありますDbContext
Service1
Service2
バックグラウンドスレッドから実行します。Service1
エンティティをフェッチしてに渡しますService2
Service2
そのエンティティを使用しますが、エンティティはから切り離されていますDbContext
実際に問題はここにあります:Service1.DbContext
との違いですService2.DbContext
。
ASP.NET MVCの別のスレッドでタスクを実行すると、呼び出しごとSimpleInjector
にの新しいインスタンスが作成されるようです。DbContext
一部のIoCライブラリ(たとえばStructureMap
)には、スレッドごと、Webリクエストごとのライフスタイルが混在していますが、そうでSimpleInjector
はないようです。私は正しいですか?
この問題を解決するためのアイデアはありSimpleInjector
ますか?前もって感謝します。
編集:
私のサービスはここにあります:
Service2
私は時々ユーザーになりますAsyncService2
。
c# - MVC 3 コントローラーの依存性注入を使用したコマンド パターン
次の記事.NET Junkie - During the command side of my architectureを読みました。これは別の stackoverflow ユーザーによって提案されたもので、コマンド パターンの概要を説明し、記事の最後に DI でそれを使用する方法についての戦略を提供しています。
これは非常に役に立ちましたが、私が見逃していることが 1 つあります。たとえば、新しいクラスを作成するとしCheckoutCustomerCommandHandler
ます。
MoveCustomerCommandHandler
さて、コンストラクターを介して何らかの理由でこのコマンドとをコントローラーに挿入する必要があるとしましょう。これは DI コンテナーのセットアップとコンストラクターにどのように影響しますか?
コアでは、どちらも同じインターフェースを実装しています。これにより、DI コンテナーのルックアップの問題が発生するようです。記事の例では、インジェクターのセットアップの例を次に示します。
dependency-injection - SimpleInjectorおよびSystem.Web.Mvc.Asyncスレッド
ここで質問の前に質問しました。マルチスレッドに関するこの質問/回答を読み、それらの解決策を知っています。しかし、今日、私は新しい問題を抱えています。コマンドを使用している場合(または元のコードにアクセスして管理および変更できる場合)、上記の回答で提案されているasync-decoratorが機能します。しかし、MVC自体が新しいスレッドを作成する場合、何ができるでしょうか。たとえば、カスタムロールプロバイダー(で動作DbContext
)があり、次のエラーが発生します:
DbContextが破棄されたため、操作を完了できません。
そして、ここにスタックトレースがあります:
[InvalidOperationException:DbContextが破棄されたため、操作を完了できません。]
System.Data.Entity.Internal.InternalContext.CheckContextNotDisposed()+67
System.Data.Entity.Internal.LazyInternalContext.InitializeContext()+34
System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(式)+22
System.Linq.Queryable.Any(IQueryable
1 source, Expression
1述語)+265MyProject.MyRoleProvider.IsUserInRole(String username、String roleName)in..。
System.Web.Security.Roles.IsUserInRole(String username、String roleName)+263
MyProject.MyPrincipal.IsInRole(String role)in..。
System.Linq.Enumerable.Any(IEnumerable
1 source, Func
2述語)+146System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext)+200
System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext)+159
System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext、IList`1フィルター、ActionDescriptor actionDescriptor)+96
System.Web.Mvc.Async。<> c__DisplayClass25.b__1e(AsyncCallback asyncCallback、Object asyncState)+446
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallbackコールバック、オブジェクト状態、Int32タイムアウト)+130
System.Web.Mvc.Async。AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext、String actionName、AsyncCallbackコールバック、オブジェクト状態)+302
System.Web.Mvc。<> c__DisplayClass1d.b__17(AsyncCallback asyncCallback、Object asyncState)+30
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallbackコールバック、オブジェクト状態、Int32タイムアウト)+130
System.Web.Mvc。Controller.BeginExecuteCore(AsyncCallbackコールバック、オブジェクト状態)+382
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallbackコールバック、オブジェクト状態、Int32タイムアウト)+130
System.Web.Mvc。Controller.BeginExecute(RequestContext requestContext、AsyncCallbackコールバック、オブジェクト状態)+317
System.Web.Mvc.Controller.System.Web.Mvc.Async。IAsyncController.BeginExecute(RequestContext requestContext、AsyncCallbackコールバック、オブジェクト状態)+15
System.Web.Mvc。<> c__DisplayClass8.b__2(AsyncCallback asyncCallback、Object asyncState)+71
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallbackコールバック、オブジェクト状態、Int32タイムアウト)+130
System.Web.Mvc。MvcHandler.BeginProcessRequest(HttpContextBase httpContext、AsyncCallbackコールバック、オブジェクト状態)+249
System.Web.Mvc。MvcHandler.BeginProcessRequest(HttpContext httpContext、AsyncCallbackコールバック、オブジェクト状態)+50
System.Web.Mvc.MvcHandler.System.Web。IHttpAsyncHandler.BeginProcessRequest(HttpContextコンテキスト、AsyncCallback cb、オブジェクトextraData)+16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+301
System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+155
ご覧のとおり、MyProject.MyRoleProvider.IsUserInRole
非同期で呼び出されましたが、これは開始しませんでした。MVC自体による非同期の呼び出しです。だから私はそれを制御することはできません。私のプロバイダーコンストラクターは次のとおりです。
public MyRoleProvider(){_context = MyIoCWrapper.GetService(); }
MyRoleProvider
インスタンス化されたときHttpContext
はnullではなく、IsInRole
呼び出されたときHttpContext
はnullのようです。新しいライフスコープを開始したい場合は、1回だけ使用され、MVCが新しいスレッドを開始した場合は、新しいスレッドも使用されDbContext
ます。私は解決策を見つけるのに混乱しました。誰かいますか?すべてのバックグラウンドスレッドの新しいライフスコープを開始するにはどうすればよいですか?それらを開始するか、MVCが開始しますか?
c# - シンプルなインジェクターを開くジェネリック デコレーター
シンプルなインジェクターの優れた機能のいくつかを利用しようとしています。
私は現在、デコレーターに問題があります。私が期待しているときにもヒットしません。
私はこのようにそれらを登録しています:
ICommandHandler<CreateProductCommand>
への呼び出しが呼び出されCreateValidFriendlyUrlCommandHandler<>
、CreateProductValidationCommandHandler<>
それ自体を実行する前に呼び出されることを期待しているため、何かが欠けているに違いないと思います。
次のような別の登録を試みました。
ICommandHandler<CreateProductCommand>
私が考えたように、型のデコレーターを登録すると、実装ICommandHandler<CreateProductCommand>
時に少し循環参照が発生する可能性があります。CreateProductValidationCommandHandler
CreateValidFriendlyUrlCommandHandler
ICommandHandler<CreateProductCommand>
しかし、それを変更しても違いはありませんでした。
これが私のものCreateProductValidationCommandHandler<TCommand>
です:
そして、これは私のものCreateValidFriendlyUrlCommandHandler<TCommand>
です:
c# - IoCを使用してレイヤーをチェーンし、下部のコールバックを上部に設定し、循環参照を回避します
操り人形の達人がひもを引っ張るのと同じように、下の層を上の層で制御する必要があるシナリオがあります。
一部の内部イベントが時々生成されるため、下位層も上位層にコールバックします。
SimpleInjectorを使用しており、ILowerをUpperコンストラクターに注入します。循環参照が発生するため、アッパーをロワーに注入できません。
代わりに、2つのレイヤーをリンクするためのレジスタコールバック関数があります。ただし、nullチェックを使用してコードを分散させる必要があります。
このオブジェクトのリンクを実現するためのより良い方法や異なるアーキテクチャはありますか?