註冊泛型類型與Autofac我都Autofac和ASP.NET核心的一個相對較新的用戶。我最近將一個「經典」ASP.NET WebAPI項目的小項目移植到ASP.NET Core。我在Autofac上遇到了麻煩,特別是在註冊泛型類型時。問題在ASP.NET核心
此項目使用一個命令模式中,每個命令處理程序是一個封閉的通用等
public class UpdateCustomerCommandHandler: ICommandHandler<UpdateCustomerCommand>
這些命令處理程序被注入到像控制器:
readonly private ICommandHandler<UpdateCustomerCommand> _updateCustomerCommand;
public ValuesController(ICommandHandler<UpdateCustomerCommand> updateCustomerCommand)
{
_updateCustomerCommand = updateCustomerCommand;
}
Autofac構造(部分)作爲:
var builder = new ContainerBuilder();
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
//This doesn't seem to be working as expected.
builder.RegisterAssemblyTypes(assemblies)
.As(t => t.GetInterfaces()
.Where(a => a.IsClosedTypeOf(typeof(ICommandHandler<>)))
.Select(a => new KeyedService("commandHandler", a)));
上面似乎沒有註冊t他如預期一般。如果我使用下面的方法註冊,它運作良好。
builder.RegisterType<UpdateCustomerCommandHandler>().As<ICommandHandler<UpdateCustomerCommand>>();
當我說「它不工作」,我的意思是,試圖實例化控制器的時候,我得到「InvalidOperationException異常:無法爲類型解析服務「BusinessLogic.ICommandHandler`1 [BusinessLogic。 UpdateCustomerCommand]',同時嘗試激活'AutoFac_Test.Controllers.ValuesController'「。
這在該項目的全部的WebAPI版效果不錯,但不是在ASP.NET核心重建之後。清楚的是,在移植到ASP.NET Core之前,這一切都非常完美。
這裏是我已經用來重建這個問題的代碼的鏈接: https://dl.dropboxusercontent.com/u/185950/AutoFac_Test.zip
****編輯解決方案DISCOVERED後****
中沒有任何事實與錯我的Autofac配置,當然不是Autofac本身。發生了什麼事是,我已經改名爲我的依賴組件的輸出,努力使裝配掃描的東西(取代的AppDomain.CurrentDomain.GetAssemblies()
更優雅,但我從來沒有修改API項目的依賴,以引用新的組件,所以Autofac是掃描其發生的正確加載的程序集是舊版本,其中不包含接口和實現我的預期......
的[可能的複製可我基於Open Generic的類型爲AutoFac創建一個鍵控服務(http://stackoverflow.com/questions/13636492/can-i-make-a-keyed-service-for-autofac-based-on-the-類型的開放式通用) – Tseng
感謝您的建議,但這個問題不是重複的。在這種情況下,請求者正在尋找註冊從特定基礎派生的泛型並實現特定的封閉泛型接口。就我而言,我只是想註冊一個特定的封閉泛型接口的實現。而且,上面的語法在傳統的ASP.NET中已經證明可以很好地工作,但在ASP.NET Core中卻沒有。我想知道是否有可能導致這種情況的反射發生了變化? – QuietSeditionist