1

申し訳ありませんが、これに最適なタイトルはわかりません...

私は .NET プログラミングの初心者 (Java のバックグラウンドが少しある) で、単純な型付き処理キューを開発しようとしています。

オブジェクトを最初の ActionQueue に入れます。内部ロジックを介して、単一IActionの inのみActionQueueがオブジェクトを処理し、次の にプッシュしますActionQueue。それぞれがandActionQueueで支えられています (しかし、それは重要ではありません):TaskBlockingCollection

Object
...
ActionQueue[IPrepare, IPrepare]
...
ActionQueue[IDownload, IDownload]
...
ActionQueue[ISave]
...
ProcessedObject

私が達成しようとしていることは次のとおりです。

  • ActionQueueジェネリックにするため、同じサブインターフェースのみをIActionsジョブに登録できます(List<T>アクションを保存するために使用します)
  • 出力を別の入力Nextにバインドするプロパティを持つActionQueueActionQueue

私の簡略化されたコードは次のようになります。

# SETUP

interface IPrepare: IAction {}
interface IDownload: IAction {}
interface ISave: IAction {}

public interface IActionQueue<in T> where T: IAction {
    IActionQueue<IAction> Next {get;set;} # it can be any action queue
    void Register(T action);
    void Run();
}

class PrepareFromDb : IPrepare {...}
class PrepareFromSettings : IPrepare {...}
class DownloadLocal : IDownload{...}
class DownloadHttp : IDownload{...}
class SaveLocal: ISave {...}

# IN MAIN METHOD

ActionQueue<IPrepare> prepareActions = new ActionQueue<IPrepare>();
prepareActions.Register(new PrepareFromDb(config));
prepareActions.Register(new PrepareFromSettings());

ActionQueue<IDownload> downloadActions = new ActionQueue<IDownload>();
downloadActions.Register(new DownloadLocal());
downloadActions.Register(new DownloadHttp());

ActionQueue<ISave> saveActions = new ActionQueue<ISave>();
saveActions.Register(new SaveLocal(RootPath));

# TRICKY PART THAT FAILS

prepareActions.Next = downloadActions # pass `prepare`d items to `download` queue
downloadActions.Next = saveActions # pass `download`ed items to `save` queue

(note out )IActionQueueとして宣言すると、関数はエラーを表示しませんが、 現在はエラーを表示しています。interface ITrackQueue<out T> where T: ITrackTransformerMainvoid Register(T action)

これは内部ライブラリのコードであり、私が唯一のユーザーであるため、すべての一般的なものを削除してコンパイルできました。しかし、私は常にできるだけ厳密にコーディングするようにしています。

または、ActionQueueの内部BlockingCollectionキューをNextプロパティとして使用することもできますが、カプセル化が壊れてしまうため、内部実装を外部に漏らしたくありません。

そこで質問です。これを実装する最もタイプセーフな方法は何ですか?

4

0 に答える 0