如果這是令人困惑的道歉,我的腦袋被炸,試圖找到解決方案,所以我的解釋可能是可怕的。只要把我指向正確的方向將是有益的,我會根據需要予以澄清。很可能這可能只是我對DI的理解不夠。提前致謝!是否有可能在DbContext構造函數中需要一個連接字符串,該連接字符串是從DI(startup.cs)配置的,沒有IDbContextFactory?
我在兩個應用程序之間共享的獨立庫中有一個DBContext(EF6)...一個ASP.Net Core 1.x Web站點和一個Azure Web功能(使用Azure函數核心工具)。當然,這些使用不同的設置文件,但這完全是另一個問題。我不希望使用任何「硬編碼」的連接字符串,所以我試圖建立DI使用appsettings.json連接字符串:
var connectionString = connectionStrings.Data.App1.ConnectionString;
services.AddScoped<AppDbContext>(_ => new AppDbContext(connectionString));
我還使用一個通用的存儲庫,我有設置爲:
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
存儲庫與DBSet中的特定實體一起工作。然後爲每個資源使用一項服務。每個服務(可以在MVC頁面或API端點中使用)的實現訪問存儲庫。例如,對於配置服務的構造是..
public AppConfigurationService(IRepository<AppConfiguration> repo)
註冊爲
services.AddScoped<IService<AppConfiguration>, AppConfigurationService>();
庫的構造函數接受「AppDbContext」一下子,我想使用上述連接字符串的一個實例。
public Repository(AppDbContext context)
調試時,我發現連接字符串並不總是設置。當AppConfigureServices執行時...連接字符串按預期傳入。但是,當一個控制器實例化一個服務時,連接字符串總是空的,所以默認的DBContext構造函數被調用。
我家的控制器的構造函數設置爲
public HomeController(IService<AppConfiguration> service)
當我試圖從任何控制器的行動的訪問服務的回購,一個是的DbContext了newed沒有連接字符串。
是否有可能在startup.cs中以這種方式設置連接字符串?我可以使用泛型基類來搞亂DI嗎?如果我使用IDbContextFactory,有什麼方法可以在去配置文件之前確定是否有可用於DbContext的連接字符串?
再次感謝任何建議/方向指示。
更新
考慮,該AppConfigurationService從BaseService繼承定義如下:
public class AppConfigurationService : BaseService<AppConfiguration>
...
public abstract class BaseService<TEntity>: IService<TEntity> where TEntity : class, IEntityId<Guid>
服務不從BaseService繼承,如:
public class ConnectionService: IService<Connection>, IServiceClone<Connection>
是新增了一個連接字符串。因此,只有從BaseService繼承的服務沒有連接字符串與DBContext。
非常感謝!我會使用IOptions嘗試一下,並讓你知道結果。 – ACG
使用IOptions不是一個真正的改變,有些調用在大多數情況下仍然沒有連接字符串。失敗和正在工作的代碼的堆棧跟蹤具有相同的原點。如果我找到其他東西,我會讓你知道的。感謝您花時間在此。 – ACG
你如何在控制器上實例化你的服務,使字符串連接變空?你是從DI還是硬編碼的方式獲得? –