問題タブ [open-generics]
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# - キャッスル ウィンザー レジスターがクローズ - ジェネリックを開く
IProcessHandler> を登録するにはどうすればよいですか?
c# - MEF 2 でクローズド タイプを使用してオープン ジェネリック タイプを構成する
MEF 2 以降、MEF はオープン ジェネリック型のクローズ型への合成をサポートしていることを理解しています。同じ合成コンテナーに追加された 2 つの異なるアセンブリからエクスポートされた型から閉じた型を合成しようとしていますが、ImportCardinalityMismatchException を受け取ります。私の管理下にないため、アセンブリの 1 つに規則を使用しています。もう一方については、属性を使用しました。
ジェネリックに関する用語がかなり混乱しているため、質問の言い方が正確にはわかりませんが、独自のクラスを明示的に実装せずに、Foo から継承し、FooUser 型パラメーターを提供することなく、新しい閉じた型を作成しようとしています。これが私がこれを行っている方法の問題なのか、それとも型が異なるアセンブリにあるという事実と関係があるのか どうかはわかりません。
あるアセンブリには、次のものがあります。
別のアセンブリには、次のものがあります。
私の登録コードでは、次のことを行いました。
後で、次のように値をエクスポートしようとします。
Exception:Thrown: "制約に一致するエクスポートが見つかりませんでした: ContractName Foo(Bar2) RequiredTypeIdentity Foo(Bar2)" (System.ComponentModel.Composition.ImportCardinalityMismatchException) System.ComponentModel.Composition.ImportCardinalityMismatchException がスローされました: "エクスポートが見つかりませんでした制約に一致するもの: ContractName Foo(Bar2) RequiredTypeIdentity Foo(Bar2)"
コンベンション インスタンスを調べたところ、コンテナには Foo{0}、Bar2、Something などのパーツがあります。ただし、まだ System.ComponentModel.Composition.ImportCardinalityMismatchException を受け取ります。
IRepository はあるが、より具体的なものがある場合やアセンブリにまたがるアイテムがない場合など、より抽象的なケースでこれが行われるのを見てきました。どんな援助でも大歓迎です。役に立つものがない限り、おそらく問題のある型から継承して、それで終わります。
編集:実際のプロジェクトで実際にここにいるのとは異なることをしている可能性がなく、上記の非常に単純化された例を作成したところ、さまざまな同様の結果が得られました。単純化した例に合わせて、いくつかの型の名前を変更しました。
構成で 1 つの構成エラーが発生しました。根本的な原因を以下に示します。詳細については、CompositionException.Errors プロパティを確認してください。
1) 制約に一致するエクスポートが見つかりませんでした: ContractName CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2) RequiredTypeIdentity CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)
結果: パーツ 'CompositionTest.Something' に import 'CompositionTest.Something..ctor (Parameter="foo", ContractName="CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)")' を設定できません。要素: CompositionTest.Something..ctor (Parameter="foo", ContractName="CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)") --> CompositionTest.Something --> AssemblyCatalog (Assembly="CompositionTest, Version=1.0.0.0, Culture=neutral、PublicKeyToken=null")
結果: エクスポート 'CompositionTest.Something (ContractName="CompositionTest.Something")' をパーツ 'CompositionTest.Something' から取得できません。要素: CompositionTest.Something (ContractName="CompositionTest.Something") --> CompositionTest.Something --> AssemblyCatalog (Assembly="CompositionTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
c# - ネストされたオープンジェネリックで複合ハンドラーを使用するには?
登録:
イベントコール
空を返しますが、2 つのハンドラーを返す必要があります。
次のようにすればいいのですが:
「GetAllInstances」の代わりに「_container.GetInstance(handlerType)」を呼び出すと、エラーが発生しました。
オープン ジェネリック型 IMessageHandler の登録でエラーが発生しました。タイプ ValidateMessageEnvelopeHandler> の登録を作成できませんでした。オープン ジェネリック型 IMessageHandler の登録でエラーが発生しました。タイプ SecureMessageEnvelopeHandler の登録を作成できませんでした。タイプ SecureMessageEnvelopeHandler のコンストラクターに、登録されていない「innerHandler」という名前のタイプ IMessageHandler のパラメーターが含まれています。IMessageHandler がコンテナーに登録されていることを確認するか、SecureMessageEnvelopeHandler のコンストラクターを変更してください。
CompositeHandler () を登録すると、エラーが発生します。( Container.RegisterOpenGeneric(typeof(IMessageHandler<>), typeof(CompositeMessageHandler<>));)
オープン ジェネリック型 IMessageHandler の登録でエラーが発生しました。タイプ ValidateMessageEnvelopeHandler> の登録を作成できませんでした。ResolveUnregisteredType イベントの複数のオブザーバーが、同じサービス タイプ IMessageHandler> のデリゲートを登録しています。登録済みハンドラーの 1 つだけが、特定のサービス タイプの ResolveUnregisteredType.Register メソッドを呼び出すようにします。
どうすればこれを修正できますか?
c# - SimpleInjector 単一のジェネリック実装に複数のオープン ジェネリック インターフェイスを登録する方法
SimpleInjector を IOC コンテナとして使い始めようとしていますが、今のところ満足しています。しかし今、私は解決できない問題に行き詰まっています。SOとドキュメントで検索しましたが、まだ回答がないようです。SimpleInjector のハウツー ドキュメントを見たことがありますが、オープン ジェネリック インターフェイスについては触れていません。
次のような 2 つの汎用インターフェイスがあります。
そして、これら 2 つのオープン ジェネリック実装が 1 つあります。
私のアプリケーションでは、SimpleInjector を次のように設定しています。
私がアーカイブしようとしているのは、IEventPublisher または IEventSubscriber を要求するときに、まったく同じインスタンスを取得したいということです。さらに、このインスタンスは、任意の T のシングルトンになります。
私はこれらの行でこれをテストしました:
残念ながら、 p と s は同じインスタンスを参照していません。誰でもこの問題の解決策を知っていますか?
c# - Ninject で Generics と IEnumerable を開く
私は次のインターフェースを持っています...
これは通常、次のように実装されます...
IRequest
は単なるマーカー インターフェイスです (この時点では)。
次の規則を使用して、すべてのハンドラーを登録します...
個々に問題なく解決します。
すべてのハンドラーを解決し、それらをコンストラクターに注入したい状況が 1 つあります...
これは機能せず、常に空を返します。
私の理解は、慣例によりそれらを として登録したためであり、これは 2 つの異なる署名ではありIHandler<ConcreteRequest>
ません。IHandler<IRequest>
すべてのハンドラーを慣例により、まとめて識別されるように登録するにはどうすればよいIEnumerable<IHandler<IRequest>>
ですか?
2 番目の登録は問題ありませんが、両方の署名を使用して 1 つの実装を解決することをお勧めします。
dependency-injection - オープンジェネリック型で構造マップを登録するとエラーが発生する
ジェネリック型を開く
実装
登録
使用法
問題:
インターフェイスICrudRepository
はプロジェクト MyApp.Repository 内にあり、実装はプロジェクト MyApp.Data 内にあります。HomeController を呼び出すと、次のような例外が発生します。何が悪いのか手掛かりがありませんか?
<
デフォルトのインスタンスが登録されておらず、タイプ ICrudRepository Employee、Int32に対して自動的に決定できません ICrudRepository Employee、 Int32>
に対して指定された構成はありません<
>
ここに What Do I have のダンプがありますか?
c# - SimpleInjector 2.6.1+ で開いているジェネリック デコレーター チェーンを単体テストする方法
SimpleInjector を使用して、次のオープンなジェネリック deocrator チェーンがあるとします。
SimpleInjector 2.4.0 では、次のコードを使用して、これを単体テストして装飾チェーンをアサートすることができました。
SimpleInjector 2.6.1 に更新した後、この単体テストは失敗します。装飾されたハンドラーではなくInstanceProducer.Registration.ImplementationType
、最初の装飾ハンドラーを返すようになりました (つまり、 .typeof(QueryNotNullDecorator<HandleFakeQueryWithoutValidator,string>)
typeof(HandleFakeQueryWithoutValidator)
また、InstanceProducer.GetRelationships()
チェーン内のすべてのデコレータを返さなくなりました。また、最初のデコレータのみを返します。
これはバグですか? そうでない場合、SimpleInjector 2.6.1+ を使用して、開いている一般的なデコレータ チェーンを単体テストするにはどうすればよいですか?
c# - autofac を使用したオープンジェネリックの条件付き登録デコレーター
私はこれらのオープンジェネリックを持っています:
そして、この単一のデコレータ:
私が望むのは、実装しているクエリに対してのみデコレータを登録することですICacheableQuery<out TResult>
。次のようなコンポーネントを登録しています。
ただし、すべてのタイプのデコレーターを登録します。何か案が?前もって感謝します。