小编50m*_*Cap的帖子

使用autofac键控服务在运行时基于通用接口解析类型

我发现了一些与我面临的问题相似的问题和回答; 但我还没能把一个有效的解决方案拼凑起来.

我有以下内容:

public interface IProcessing<V,W> where W: TaskResponse where V: TaskRequest
    {
         W process(V req);
    }
Run Code Online (Sandbox Code Playgroud)

where TaskRequest&TaskResponse 是抽象基类

这个具体类也定义了:

public class MathProcessor : IProcessing<MathRequest, MathResponse>
    {
         public MathResponse process(MathRequest req) {
            // do stuff
            // create a MathResponse instance

            return resp;
        }
    }
Run Code Online (Sandbox Code Playgroud)

where MathRequest&MathResponse是派生类,各个抽象类用作接口定义中的约束.

根据其界面注册具体类型并使用autofac解析是可以的.
但是,在运行时基于另一种类型(在这种情况下是请求对象MathRequest)尝试解析具体类型的预期用法产生了困难.这基本上是为了实现常见的消息处理程序模式(伪代码跟随),其中接收消息并将其分派给适当的处理程序:

TaskRequest req = getNextRequest();

var proc = container.Resolve(req.getType().Name)

proc.process(req);
Run Code Online (Sandbox Code Playgroud)

基于论坛中的相关主题,基本建议是定义工厂并将其注册到容器,然后在运行时使用工厂根据提供的参数创建我需要的对象.这似乎是正确的.

我也看到了相关的建议,即使用IIndex<K,V>autofac中的功能按键查找相应的类型/服务.

我在注册时遇到问题MathProcessor,并且按键是类型解析类型(在这种情况下MathRequest).该错误可能与通用接口定义和允许的内容更相关.

注册:

builder.RegisterType<MathProcessor>().As<IProcessing<MathRequest, MathResponse>>().Keyed<IProcessing<MathRequest, MathResponse>>(strTypeName);
Run Code Online (Sandbox Code Playgroud)

没关系,但是

builder.RegisterType<MathProcessor>().As<IProcessing<TaskRequest, …
Run Code Online (Sandbox Code Playgroud)

c# generics runtime autofac

5
推荐指数
1
解决办法
4655
查看次数

标签 统计

autofac ×1

c# ×1

generics ×1

runtime ×1