【问题标题】:Autofac to resolve generic controllerAutofac 解决通用控制器
【发布时间】:2018-04-01 17:11:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 认为您需要使用自定义控制器发现

标签: c# autofac


【解决方案1】:

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

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

这里的另一种可能性是将IComponentContext 注入非通用控制器并在控制器本身中“即时”解析主数据服务,从而在控制器中制作关闭通用所需的类型。

无论如何,这是对一般问题的一般回答。如果您需要更详细的答案,您需要更深入地了解您在做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多