3 回答

TA貢獻1772條經驗 獲得超8個贊
您可能會遇到操作順序問題。一般來說,最后的勝利。這適用于 Autofac 和基本的 Microsoft DI 容器。
假設您已閱讀有關 Autofac ASP.NET Core 集成的文檔,您將看到,ConfigureContainer
操作順序大致如下:
WebHost 特定的 ConfigureServices
啟動類 ConfigureServices
啟動類 ConfigureContainer
在適當?shù)奈恢锰砑?ConfigureTestServices 時,它看起來(雖然我還沒有通過)它在 WebHost 和啟動類 ConfigureServices 之后運行......但它仍然在 ConfigureContainer 之前運行。
這很容易測試 - 創(chuàng)建一個具有三種不同實現(xiàn)的服務接口。在每個級別注冊不同的實現(xiàn)。解析控制器中的接口。你得到了哪一個?那是最后一個運行?,F(xiàn)在從應用程序中刪除該注冊并重試。你得到的下一個是什么?這是倒數(shù)第二個。等等。
Autofac 采用預構建IServicesCollection
并循環(huán)遍歷它,將其添加到本機 Autofac 容器中。一旦發(fā)生這種情況,您是否修改集合都沒有關系。Autofac 無法控制 ASP.NET Core 中啟動機制的執(zhí)行順序;它只知道 ASP.NET Core 說:“這是要繼續(xù)導入的最終服務集合!” 如果這不是在正確的階段發(fā)生,您將不得不做以下兩件事之一:
使用 Microsoft 注冊語言而不是本機 Autofac,將您需要覆蓋的注冊移出
ConfigureContainer
和移入其中一種ConfigureServices
方法。以其他方式執(zhí)行覆蓋,例如使用
ASPNETCORE_ENVIRONMENT
設置Test
和提供ConfigureTestContainer
方法。(特定于環(huán)境的注冊方法示例在文檔中。)

TA貢獻1842條經驗 獲得超13個贊
當像這樣使用 ContainerBuilder 時:
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<UserService>().As<IUserService>();
}
您必須使用 ConfigureTestContainer 而不是 ConfigureTestServices,如下所示:
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterType<TestUsersService>().As<IUserService>();
});
}
這是調用ConfigureContainer后執(zhí)行,并會正確地覆蓋IUserService有TestUsersService

TA貢獻1805條經驗 獲得超10個贊
對于來自 google 的那些,我想添加到 Michael 的出色答案中,該答案ConfigureTestContainer
不適用于Microsoft從 .NET Core 3.0 開始通過網絡主機推薦的通用主機。然而,Autofac 團隊的 Alistair Evans 提出了一種解決方法。不幸的是,它依賴于IStartupConfigureContainerFilter
可能會在 .NET 5.0 中刪除的棄用。
這意味著當前在 .NET 5.0 中,當使用通用主機時,無法在集成測試中模擬外部 DI 容器注入的依賴項。
幸運的是,來自 ASP.NET 團隊的 David Fowler正在調查這個問題。
- 3 回答
- 0 關注
- 244 瀏覽
添加回答
舉報