簡體   English   中英

嘗試基於autofac中在運行時傳遞的泛型類型來解析接口實現

[英]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

我認為這是因為在運行時TIData而不是我傳遞的特定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);

我想我意識到這是因為TIData而不是導致我的代碼失敗的實現。 雖然我已經改變了我的代碼以使用命名實例並返回非泛型的'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM