![](/img/trans.png)
[英]Resolving type based on Generic Interface at runtime with autofac keyed services
[英]Trying to resolve an interface implementation based on generic type passed at runtime in autofac
我想根據在運行時傳遞的輸入參數的類型從autofac解析特定的接口實現。
在我的代碼中,我有不同的IMyTask<>
:
MySillyTask : IMyTask<SillyData>
MyAwesomeTask : IMyTask<AwesomeData>
我像這樣注冊MyTask<>
的實現:
builder.RegisterAssemblyTypes(typeof (IMyTask<>).Assembly)
.AsClosedTypesOf(typeof (IMyTask<>));
我想使用一個帶有注入的Autofac IComponentContext
的類來根據傳遞的數據類型來解析數據:
public IMyTask<T> GetTask<T>(T input) where T : IData
{
var myTask = _componentContext.Resolve<IMyTask<T>>(); // fails
return myTask;
}
我收到The requested service has not been registered
錯誤。
如果我嘗試為硬編碼的IData
類型解析它,它可以工作:
var myTask = _componentContext.Resolve<IMyTask<SillyData>>(); // works! MySillyTask resolved
我認為這是因為在運行時T
是IData
而不是我傳遞的特定IData
實現,但有沒有辦法更改代碼以獲得我需要的功能?
編輯:根據要求提供完整的錯誤消息:
The requested service 'Whatever.Tasks.IMyTask`1[[Whatever.Inputs.IData, Whatever, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.
我如何調用GetTask
:
IData myData = input.MyData;
taskResolver.GetTask(myData);
我想我意識到這是因為T
是IData
而不是導致我的代碼失敗的實現。 雖然我已經改變了我的代碼以使用命名實例並返回非泛型的'IMyTask',但我仍然感興趣,如果我可以使用autofac以我最初的意圖解決它。
我對AutFac了解不多,但我認為component.Resolve(...)
有一個接受類型的重載。
我成功地使用Ninject做了類似的事情
public IMyTask GetTask<T>(T input) where T : IData
{
var taskType = typeof(IMyTask<>);
var inputType = input.GetType();
var genericType = taskType.MakeGenericType(inputType);
return (IMyTask)_componentContext.Resolve(genericType);
}
你沒有提供調用它的代碼,但我懷疑問題是類型T
是基於你所調用的代碼知道的,而不是實際的input
類型。 如果調用代碼將其稱為GetTask<SillyData>(obj);
我懷疑它IData
,但我認為你的obj
是一個恰好是SillyData
。
如果您需要在不事先知道Type的情況下調用泛型方法,則必須使用Reflection。 您可以使用input.GetType()
來獲取真實的底層類型,然后使用MakeGenericType
來生成ITask<SillyData>
然后使用MakeGenericMethod
來調用Resolve
。
這是另一個堆棧溢出問題,它將向您展示如何通過傳遞Type參數來調用泛型:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.