私はタイプを介してコンパイル時の依存性検証を達成しようとしています。結局のところ、これは依存性注入の使用に由来しています。私はServiceCollectionに依存性を追加するのを忘れてしまいます。私は一種のビルダーを持っていて、依存するものが既に追加されていない限り、アイテムを追加できないようにしたいとします。私はこれが一例で最もよく説明されると思う。また、成功するビルダーパターン、リターンタイプを増やす?
var myBuilder = MyBuilder(configuration)
.AddThing()
.AddMyServiceRequiresThing() // dependency satisfied by AddThing()
.AddThing2()
.AddMyService2RequiresThing2(); // dependency satisfied by AddThing2()
そしてもちろん以下:基本的に
var myBuilder = MyBuilder(configuration)
.AddThing()
.AddThing2()
.AddMyServiceRequiresThing() // dependency satisfied by AddThing()
.AddMyService2RequiresThing2(); // dependency satisfied by AddThing2()
を、ときに私は次のように失敗したいと思います:
var myBuilder = new MyBuilder(configuration)
.AddMyServiceRequiresThing() // dependency not satisfied, type error
.AddMySecondServiceRequiresThing2() // dependency not satisfied, type error
.AddMyThing()
.AddMyThing2();
をしかし、私は成功するために、次のようになります「Thing」を追加することで、ビルダーのタイプを強化して、現在そのことを提供してほしいと思っています。しかし、 "MyService"と "MyService2"は異なるものを必要とする可能性があるため、元のBuilderタイプ(拡張機能なし)を返すことができず、必要なものを返すことはできません。
私はいくつかのジェネリック魔法を試しましたが、どこにも巻き込まれていません。私はこれを実行時ロジックを介して強制することができますが、私は型システムが私のためにそれをやりたいと思っています。これを行うには、C#の型システムは十分強力ですか?すべての情報はコンパイル時に入手できますが、表現できるかどうかわかりません。
"これを行うのに十分な強さのC#のシステムですか?"そして静的に型付けされた他の言語がありますか? –
コンパイル時に次のようにチェックすることができます。 Bool変数をfalseに初期化しました。 Addthing()でそのbool変数をtrueに設定し、requiresthing()でそれをチェックすると、セクションに決して到達しないことをVisual Studioが警告した場合、コンパイル時にチェックすることができます。 さらに、例外がプログラミングエラーを処理することができます。 – gismo
@WiktorZychla TBH私は、この種のパターンが可能かどうかを知るために、Haskellのようなより強力な型システムに慣れていません。 – jrk