gpt4 book ai didi

c# - 尝试根据在 autofac 中运行时传递的泛型类型解析接口(interface)实现

转载 作者:行者123 更新时间:2023-11-30 16:12:12 26 4
gpt4 key购买 nike

我想根据在运行时传递的输入参数的类型从 autofac 解析一个特定的接口(interface)实现。

在我的代码中,我有不同的 IMyTask<> 实现:

MySillyTask : IMyTask<SillyData>

MyAwesomeTask : IMyTask<AwesomeData>

我注册了 MyTask<> 的实现像这样:

builder.RegisterAssemblyTypes(typeof (IMyTask<>).Assembly)
.AsClosedTypesOf(typeof (IMyTask<>));

我想使用一个注入(inject)了 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);
}

关于c# - 尝试根据在 autofac 中运行时传递的泛型类型解析接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23295594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com