Autofac解析通用控制器

时间:2018-04-01 17:11:35

标签: c# autofac

我有一个普通的主数据服务。示例:IMasterDataService<T>

我正在尝试以类似MasterDataController<T>的方式为此构建一个Api控制器。我想使用autofac解析控制器,但我找不到任何相同的文档。

当我尝试时,我收到错误消息,因为无法解析类型。

我正在注册这个服务的builder.RegisterGeneric,但是控制器我没有得到实例,我想知道这是否可行。

1 个答案:

答案 0 :(得分:0)

好吧,无论如何,你无法在运行时解析泛型类。你需要参数化它。这意味着在解析通用控制器之前,您必须具有一个类型来关闭此通用控件。我想到的所有类型的唯一合理来源是请求本身,否则控制器不是通用的,它对我来说没有意义。因此,您需要以某种方式使用传入请求来制作您的类型,然后使用某种自定义控制器工厂或激活器或您正在使用的框架中调用的任何内容,根据该类型解析您的控制器。例如,在.NET Core中,这将是IControllerActivator,您需要在执行此操作之前使用.AddControllersAsServices()扩展名在DI容器中注册控制器。

编辑 Microsoft's documentation中实际上有一个针对dotnet核心的实现。但他们使用略有不同的技术:他们实际上没有注册开放通用控制器。他们制作封闭通用控制器的所有预定义变体,并注册它们。我认为这是因为微软的IoC容器无法解决开放式通用注册中的封闭泛型类型 - 至少它在.NET Core 1.x中无法做到这一点,我还没有在2.0中尝试过。但是,使用Autofac是可能的,所以我认为这种方法应该有效。

此处的另一种可能性是将IComponentContext注入非通用控制器并在控制器中“动态”解析主数据服务,从而在控制器中创建关闭通用权所需的类型。

无论如何,这是一般问题的通用答案。如果您需要更详细的答案,您需要更深入地了解您正在做的事情。