0

如果這是令人困惑的道歉,我的腦袋被炸,試圖找到解決方案,所以我的解釋可能是可怕的。只要把我指向正確的方向將是有益的,我會根據需要予以澄清。很可能這可能只是我對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。

回答

0

也許您可以嘗試將連接字符串設置爲單例,因爲您有兩個分離的應用程序共享同一個存儲庫。

事情是這樣的:

interface IConnectionProvider { string GetConnectionString(); } 
public class ConnectionProvider : IConnectionProvider { public string GetConnectionString() { return connectionStrings.Data.App1.ConnectionString; } } 

services.AddSingleton<IConnectionProvider, ConnectionProvider>(); 

然後修改你的DbContext接收連接提供商:

public AppDbContext(IConnectionProvider provider) : base(provider.GetConnectionString()) 

希望它幫助。

+0

非常感謝!我會使用IOptions嘗試一下,並讓你知道結果。 – ACG

+0

使用IOptions不是一個真正的改變,有些調用在大多數情況下仍然沒有連接字符串。失敗和正在工作的代碼的堆棧跟蹤具有相同的原點。如果我找到其他東西,我會讓你知道的。感謝您花時間在此。 – ACG

+0

你如何在控制器上實例化你的服務,使字符串連接變空?你是從DI還是硬編碼的方式獲得? –

相關問題