問題タブ [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.

0 投票する
1 に答える
2324 参照

mapping - IMappingEngine (AutoMapper) を登録するシンプルなインジェクター

以前は Autofac を使用していましたが、SimpleInjector を試してみたいと思います。私の問題は、メソッド内で mappingEngine を呼び出すと、次のエラーが発生することです。

タイプ マップ構成が欠落しているか、サポートされていないマッピングです。

マッピング タイプ: Something -> SomethingDto 宛先パス: IEnumerable`1[0]

ソース値:

Mapper.Map は私が望むものではありません。ここに基づいてAutomapperを登録しています:

Ninject を単純なインジェクターに置き換える


私の質問は、IMappingEngine を SimpleInjector に登録し、プロファイルを正しく追加するにはどうすればよいですか?

前もって感謝します!

mtraxに挨拶

0 投票する
1 に答える
204 参照

.net - SimpleInjectorでデータベース接続エラーを処理するための構造

別のボックスでSQLサーバーに接続するEntityFrameworkアプリケーションがあります。プログラムフローは、次の2つの状態に分類できます。

  1. SimpleInjectorDIフレームワークを使用してコンポジションルートとレジスタタイプを初期化します
  2. Initアプリケーション(Entity Frameworkを使用してSQLデータベースで読み取りと書き込みを行います)
  3. タイマーに基づいて、タスク関数は実行予定のコマンドのインスタンスを取得しますICommandHandler<CommandType>(コマンドタイプは異なります)
  4. Handle(commandType)このインスタンスを呼び出してコマンドを実行します
  5. 手順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は、プロシージャ呼び出しをラップするために使用できるデコレータを使用できることを確認しました。

0 投票する
0 に答える
509 参照

dependency-injection - 単純なインジェクター ASP.NET MVC 投稿フォームの結果エラー

私は単純なインジェクターを初めて使用し、codeplex と nuget パッケージのガイドで説明されているようにすべてのインスタンスを登録します。リンクをクリックすると、フォームバック結果のないアクションに関連するすべてが正常に機能します。

いくつかのデータが入力されたフォームがあり、送信ボタンがクリックされた後、get メソッドまたは post メソッドに対して、コンテナが初期化されていないなどのエラーが発生します。

「このオブジェクトにはパラメーターなしのコンストラクターが定義されていません。」

なぜこれが起こったのか理解できません。

0 投票する
2 に答える
641 参照

.net - SimpleInjector のジェネリック型制約に基づくコマンド デコレーターの条件付き登録

に条件付きデコレータを登録する方法はSimpleInjector? ここに私の定義があります:

そして、私はしようとしています:

0 投票する
1 に答える
1781 参照

dependency-injection - SimpleInjector-すべてのインターフェースのタイプを登録します

実装しているすべてのインターフェースに型を登録することは可能ですか?例:私は:

0 投票する
1 に答える
6204 参照

c# - シンプルなインジェクターを使用したスレッドごととWebごとのリクエストの混合ライフスタイル

SimpleInjectorIoCライブラリとして使用しています。DbContextWebリクエストに従って登録しましたが、正常に機能します。しかし、バックグラウンドスレッドで実行するタスクが1つあります。DbContextそのため、インスタンスの作成に問題があります。例えば

  1. Service1のインスタンスがありますDbContext
  2. Service2のインスタンスがありますDbContext
  3. Service1Service2バックグラウンドスレッドから実行します。
  4. Service1エンティティをフェッチしてに渡しますService2
  5. Service2そのエンティティを使用しますが、エンティティはから切り離されていますDbContext

実際に問題はここにあります:Service1.DbContextとの違いですService2.DbContext

ASP.NET MVCの別のスレッドでタスクを実行すると、呼び出しごとSimpleInjectorにの新しいインスタンスが作成されるようです。DbContext一部のIoCライブラリ(たとえばStructureMap)には、スレッドごと、Webリクエストごとのライフスタイルが混在していますが、そうでSimpleInjectorはないようです。私は正しいですか?

この問題を解決するためのアイデアはありSimpleInjectorますか?前もって感謝します。

編集:

私のサービスはここにあります:

Service2私は時々ユーザーになりますAsyncService2

0 投票する
1 に答える
2573 参照

c# - MVC 3 コントローラーの依存性注入を使用したコマンド パターン

次の記事.NET Junkie - During the command side of my architectureを読みました。これは別の stackoverflow ユーザーによって提案されたもので、コマンド パターンの概要を説明し、記事の最後に DI でそれを使用する方法についての戦略を提供しています。

これは非常に役に立ちましたが、私が見逃していることが 1 つあります。たとえば、新しいクラスを作成するとしCheckoutCustomerCommandHandlerます。

MoveCustomerCommandHandlerさて、コンストラクターを介して何らかの理由でこのコマンドとをコントローラーに挿入する必要があるとしましょう。これは DI コンテナーのセットアップとコンストラクターにどのように影響しますか?

コアでは、どちらも同じインターフェースを実装しています。これにより、DI コンテナーのルックアップの問題が発生するようです。記事の例では、インジェクターのセットアップの例を次に示します。

0 投票する
1 に答える
917 参照

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, Expression1述語)+265

MyProject.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, Func2述語)+146

System.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が開始しますか?

0 投票する
1 に答える
1363 参照

c# - シンプルなインジェクターを開くジェネリック デコレーター

シンプルなインジェクターの優れた機能のいくつかを利用しようとしています。

私は現在、デコレーターに問題があります。私が期待しているときにもヒットしません。

私はこのようにそれらを登録しています:

ICommandHandler<CreateProductCommand>への呼び出しが呼び出されCreateValidFriendlyUrlCommandHandler<>CreateProductValidationCommandHandler<>それ自体を実行する前に呼び出されることを期待しているため、何かが欠けているに違いないと思います。

次のような別の登録を試みました。

ICommandHandler<CreateProductCommand>私が考えたように、型のデコレーターを登録すると、実装ICommandHandler<CreateProductCommand>時に少し循環参照が発生する可能性があります。CreateProductValidationCommandHandlerCreateValidFriendlyUrlCommandHandlerICommandHandler<CreateProductCommand>

しかし、それを変更しても違いはありませんでした。

これが私のものCreateProductValidationCommandHandler<TCommand>です:

そして、これは私のものCreateValidFriendlyUrlCommandHandler<TCommand>です:

0 投票する
4 に答える
414 参照

c# - IoCを使用してレイヤーをチェーンし、下部のコールバックを上部に設定し、循環参照を回避します

操り人形の達人がひもを引っ張るのと同じように、下の層を上の層で制御する必要があるシナリオがあります。

一部の内部イベントが時々生成されるため、下位層も上位層にコールバックします。

SimpleInjectorを使用しており、ILowerをUpperコンストラクターに注入します。循環参照が発生するため、アッパーをロワーに注入できません。

代わりに、2つのレイヤーをリンクするためのレジスタコールバック関数があります。ただし、nullチェックを使用してコードを分散させる必要があります。

このオブジェクトのリンクを実現するためのより良い方法や異なるアーキテクチャはありますか?