如何在Simple Injector中注册具有复杂类型约束的开放通用类型?

oguzh4n

我有一个开放的泛型类型AccessMessageHandler<TProcess>,每次解析后都想IProcessHandler<AccessMessage<TProcess>>解析。我怎样才能做到这一点?

这是我的代码:

public interface IProcess {}

public interface IProcessHandler<in TProcess> where TProcess : IProcess {
    void Handle(TProcess message);
}

public class AccessMessage<TProcess> : IProcess where TProcess : IProcess {
    public virtual string Username {get;protected set;}
    public virtual TProcess InnerProcess { get; protected set; }
}

public class AccessMessageHandler<TProcess> : IProcessHandler<AccessMessage<TProcess>> 
    where TProcess : IProcess {
    public AccessMessageHandler(IProcessHandler<TProcess> innerHandler){}
    public void Handle(AccessMessage<TProcess> message){
      // access control
      _innerHandler.Handle(message.InnerProcess)
    }
}

public class JustDoIt : IProcess {
    public virtual string What {get;set;}
}

public class JustDoItHandler : IProcessHandler<JustDoIt> {
    public void Handle(JustDoIt message) {
      // handle
    }
}

我该如何注册IProcessHandler,AccessMessageHandler for Simple Injector解析如下:

var accessMessageProcess = new AccessMessage<JustDoIt>()
{ 
    Username = "user", 
    InnerProcess = new JustDoIt() { What="xxx" }
};

var handler  = GetHandlerFor(accessMessageProcess); 

// must return AccessMessageHandler<JustDoIt>(JustDoItHandler)
handler.Handle(accessMessageProcess);
史蒂文

您可以进行以下注册:

container.RegisterManyForOpenGeneric(
    typeof(IProcessHandler<>), 
    typeof(JustDoItHandler).Assembly);

container.RegisterOpenGeneric(
    typeof(IProcessHandler<>), 
    typeof(AccessMessageHandler<>));

调用RegisterManyForOpenGeneric将搜索的程序集,JustDoItHandler并查找的所有公共具体(非通用)实现IProcessHandler<TProcess>最后,这与对手动进行一堆调用相同container.Register<IProcessHandler<SomeProcess>, SomeProcessHandler>()

的调用RegisterOpenGeneric将开放通用抽象映射到开放通用类型。它在后台使用未注册的类型解析,因此每次IProcessHandler<TProcess>请求未显式注册(RegisterManyForOpenGeneric例如,使用)的a时,AccessMessageHandler<TProcess>都会解析an (如果通用类型约束匹配)。

以下代码可用于解析对象图并执行处理程序:

var handler = container.GetInstance<IProcessHandler<AccessMessage<JustDoIt>>>();

handler.Handle(accessMessageProcess);

这应该可以解决以下图形:

IProcessHandler<AccessMessage<JustDoIt>> handler = 
    new AccessMessageHandler<JustDoIt>(
        new JustDoItHandler());

确实注意到,虽然该AccessMessageHandler<TProcess>不是一个装饰。装饰器包装与实现相同的类型,但是您的AccessMessageHandler<TProcess>实现IProcessHandler<AccessMessage<TProcess>>却包装IProcessHandler<TProcess>我认为这种模式的正确名称是代理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Simple Injector将开放通用类型注册为后备

来自分类Dev

在Simple Injector中注册具有构造函数参数的泛型类型

来自分类Dev

如何在MVVMCross中注册通用类型

来自分类Dev

如何创建具有许多复杂类型的UI控件

来自分类Dev

在Simple Injector中注册具有多个构造函数和字符串依赖性的类型

来自分类Dev

如何禁用通用类型的复杂类型字段的延迟加载?

来自分类Dev

如何在.NET DI中注入具有类型约束的类?

来自分类Dev

C#-如何从列表中获取具有复杂类型的项目

来自分类Dev

如何在没有类型定义的情况下定义通用类型的“具有属性”约束?

来自分类Dev

如何在Autofac中注册循环类型?

来自分类Dev

如何在Simple Injector中用两种类型注册泛型?

来自分类Dev

在Unity中注册嵌套的开放通用类型

来自分类Dev

在Unity中注册嵌套的开放通用类型

来自分类Dev

如何在suds python中创建复杂类型

来自分类Dev

如何在实体索引中包含复杂类型?

来自分类Dev

如何在Pytorch中将张量转换为复杂类型?

来自分类Dev

如何在Android中创建复杂类型

来自分类Dev

如何在fortran 90中声明复杂类型数组

来自分类Dev

如何将通用类型参数用作声明为具有类型约束的接口的属性的类型参数?

来自分类Dev

如何声明具有类型约束的数组?

来自分类Dev

如何设置通用约束以确保两种类型之间的公用键也具有相同的值类型?

来自分类Dev

如何在带有参数的Autofac中注册类型并通过参数解析它?

来自分类Dev

如何定义在SOAP中定义复杂类型数组的类型

来自分类Dev

用Simple Injector包装通用类型

来自分类Dev

创建容器后如何在autofac中注册类型

来自分类Dev

如何使用Simple Injector解析具有值类型依赖项的MVC控制器?

来自分类Dev

如何为带有项目列表的肥皂响应定义WSDL复杂类型

来自分类Dev

如何为带有项目列表的肥皂响应定义WSDL复杂类型

来自分类Dev

如何创建具有多个通用类型参数的类型

Related 相关文章

  1. 1

    使用Simple Injector将开放通用类型注册为后备

  2. 2

    在Simple Injector中注册具有构造函数参数的泛型类型

  3. 3

    如何在MVVMCross中注册通用类型

  4. 4

    如何创建具有许多复杂类型的UI控件

  5. 5

    在Simple Injector中注册具有多个构造函数和字符串依赖性的类型

  6. 6

    如何禁用通用类型的复杂类型字段的延迟加载?

  7. 7

    如何在.NET DI中注入具有类型约束的类?

  8. 8

    C#-如何从列表中获取具有复杂类型的项目

  9. 9

    如何在没有类型定义的情况下定义通用类型的“具有属性”约束?

  10. 10

    如何在Autofac中注册循环类型?

  11. 11

    如何在Simple Injector中用两种类型注册泛型?

  12. 12

    在Unity中注册嵌套的开放通用类型

  13. 13

    在Unity中注册嵌套的开放通用类型

  14. 14

    如何在suds python中创建复杂类型

  15. 15

    如何在实体索引中包含复杂类型?

  16. 16

    如何在Pytorch中将张量转换为复杂类型?

  17. 17

    如何在Android中创建复杂类型

  18. 18

    如何在fortran 90中声明复杂类型数组

  19. 19

    如何将通用类型参数用作声明为具有类型约束的接口的属性的类型参数?

  20. 20

    如何声明具有类型约束的数组?

  21. 21

    如何设置通用约束以确保两种类型之间的公用键也具有相同的值类型?

  22. 22

    如何在带有参数的Autofac中注册类型并通过参数解析它?

  23. 23

    如何定义在SOAP中定义复杂类型数组的类型

  24. 24

    用Simple Injector包装通用类型

  25. 25

    创建容器后如何在autofac中注册类型

  26. 26

    如何使用Simple Injector解析具有值类型依赖项的MVC控制器?

  27. 27

    如何为带有项目列表的肥皂响应定义WSDL复杂类型

  28. 28

    如何为带有项目列表的肥皂响应定义WSDL复杂类型

  29. 29

    如何创建具有多个通用类型参数的类型

热门标签

归档