我想通過類型實現編譯時依賴驗證。最終這源於使用依賴注入,我厭倦了忘記添加一個依賴到ServiceCollection。比方說,我有一個建造者,我不想添加一個項目,除非它所依賴的東西已經被添加。我認爲這可以通過一個例子來最好地說明。我想下面的失敗:構建模式,增加返回類型?
var myBuilder = new MyBuilder(configuration)
.AddMyServiceRequiresThing() // dependency not satisfied, type error
.AddMySecondServiceRequiresThing2() // dependency not satisfied, type error
.AddMyThing()
.AddMyThing2();
但我想下面的成功:
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()
從本質上講,增加一件「事情」,我希望建築師的類型得到增強,因爲它現在提供了這個東西。但是由於「MyService」和「MyService2」可能需要不同的東西,它們不能只返回原始的構建器類型(不增強),並且它們不能僅僅返回它們需要的東西,因爲它們的需求可能不相關。
我嘗試了一些仿製藥,但已經無處可尋。我可以通過運行時邏輯強制執行此操作,但我希望類型系統爲我執行此操作。 c#的類型系統足夠強大,可以執行此操作嗎?所有的信息在編譯時可用,我只是不知道是否可以表達。
「c#的類型系統是否足夠強大?」還有沒有其他靜態類型的語言這種事情就像你期望的那樣工作? –
您可以通過以下方式測試編譯時間: 將Bool變量初始化爲false。 如果您在Addthing()中將該bool變量設置爲true,並在requiresthing()中檢查它,如果visual studio警告您該部分永遠不會到達,您可以推斷它在編譯時檢查。 此外,異常可以照顧編程錯誤。 – gismo
@WiktorZychla TBH對於像Haskell這樣的更強大的類型系統或者(在這裏插入你喜歡的類型系統),我不太瞭解這個類型的模式是否可行。 – jrk