尝试基于运行时在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;
}

我得到所请求的服务尚未注册错误.

如果我尝试将其解析为硬编码的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);
    }
上一篇:C#-策略工厂模式的自动配置(已解决)


下一篇:c#-Autofac-在解析时在.OnActivated方法内传递值