私はこの問題を数時間で解決しようとしています。私はインターネットを検索し、多くのStackoverflowの質問を見ましたが、誰も私を助けることができませんでした。StructureMap複数の種類の汎用タイプを開く
パイプラインを構築しています。基本的なconecptは以下の通りです:
- PipelineStore(シングルトン) - 一方のエンティティあたり
Pipeline
(アカウント、連絡先、...) - PipelineStep - パイプライン[TEntity](トランジェント)登録されているすべての
Pipeline
- が含まれています[TOperation、TInteractor、TEntity(トランジェント) - ジェネリック型を表す
Pipeline
[]
当たり多くの工程。
StructureMapを使用してパイプラインとPipelineStepを作成します。それから私はIPipelineFactoryが注入され、以下のようにそれを使用し得る
For<IPipelineFactory>().CreateFactory();
For(typeof(IPipeline<>))
.Use(typeof(Pipeline<>))
.Transient();
:
私はレジストリにそれを登録しIPipeline<TEntity> CreatePipeline<TEntity>() TEntity : EntityDTO, new();
:だから私は、単一の機能を有するIPipelineFactory
と呼ばれる自動車工場を作成しました
public IPipeline<TEntity> NewPipeline<TEntity>()
where TEntity : EntityDTO, new()
{
var pipeline = _pipelineFactory.CreatePipeline<TEntity>();
_pipelines.Add(pipeline);
return pipeline;
}
これは素晴らしいですが、私がパイプラインで同じことをしようとするとESTEPそれは失敗します。
public interface IPipelineStepFactory
{
IPipelineStep<TOperation, TInteractor, TEntity> CreatePipelineStep<TOperation, TInteractor, TEntity>()
where TOperation : IOperation<TInteractor, TEntity>
where TInteractor : IInteractor<TEntity>
where TEntity : EntityDTO, new();
}
および登録:
For<IPipelineStepFactory>().CreateFactory();
For(typeof(IPipelineStep<,,>))
.Use(typeof(PipelineStep<,,>));
用法:
public IAddPipeline<TEntity> Pipe<TOperation, TInteractor>()
where TOperation : IOperation<TInteractor, TEntity>
where TInteractor : IInteractor<TEntity>
{
var step = PipelineStepFactory.CreatePipelineStep<TOperation, TInteractor, TEntity>();
RegisteredSteps.Add(step);
return this;
}
私はそれが実行時に次の例外をスローするコードをテストしてみてください:
をNo default Instance is registered and cannot be automatically determined for type 'IPipelineStep<TestOperation, ITestInteractor, TestEntity>'
There is no configuration specified for IPipelineStep<TestOperation, ITestInteractor, TestEntity>
私はおそらく、複数の型引数を持つオープンジェネリック型のサポートがないと考えています。この問題を解決するためのワークラウンドがある場合は、教えてください。御時間ありがとうございます!