我想根据运行时传递的输入参数的类型,从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;
}
我得到所请求的服务尚未注册错误.
如果我尝试将其解析为硬编码的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);
}