iT邦幫忙

0

C# 請問static class能夠使用依賴注入嗎

Ks 2020-07-21 12:00:323375 瀏覽
  • 分享至 

  • xImage

我做了一個dll能夠使用IApiClients,在TestController的時候可以這樣使用
https://ithelp.ithome.com.tw/upload/images/20200721/20109990gbbEFixkTc.jpg

但是我想使用在static class就會出現錯誤,
就算加入了static在上面的IApiClients, Test Contractor裡面的也會有問題

請問有什麼辦法可以使用IApiClients在static class?
https://ithelp.ithome.com.tw/upload/images/20200721/20109990xpJonRR2E0.png

或者在這個IApiClients我要使用在Static class的话,需要怎麼去改dll设计呢?

這個dll的功能是讓其他project可以更容易的整合api服務,不用重新寫

fillano iT邦超人 1 級 ‧ 2020-07-21 13:27:10 檢舉
你知道什麼是static嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
glj8989332
iT邦研究生 4 級 ‧ 2020-07-21 14:00:39
最佳解答

這個先釐清何謂static, static是一開始程式執行後, 大家都能共用的方法/屬性, 和Instance(Object) 是不一樣的. 所以編譯器提示 static不能存取非Static的物件 的錯誤訊息, 也就代表ApiClients物件是在Test的instance所擁有的屬性, 並非static.

要達到static又能使用service有個方法,ServiceLocator這個anti-pattern. 可以提示你該怎麼做.

專案是ASP.Net Core 2.1 (其他版本照理都可行)

  1. 在Startup.cs的ConfigureServices確定有注入ApiClients service.
  2. 在Startup.cs的ConfigureServices的最後, 從IServiceCollection呼叫BuildServiceProvider, 把ServiceProvider存在ServiceLocator
  3. ServiceLocator寫一個GetService的泛型方法
  4. 在你的Test的testAsync方法裡, 透過ServiceLocator取得ApiClients方法, 即可使用它.

以上你再試試看吧~

Ks iT邦新手 3 級 ‧ 2020-07-21 15:16:44 檢舉
glj8989332 iT邦研究生 4 級 ‧ 2020-07-21 15:41:56 檢舉

恭喜呀~ ServiceLocator有很多種實作方式, 可以多比較看看別人設計的思想.

假如不想用.Net Core內建的DI, 也能考慮Unity / Autofac / Ninject 等DI套件,這些也有相關的GetService可用.
/images/emoticon/emoticon08.gif

我要發表回答

立即登入回答