繁体   English   中英

使用Autofac解析所有派生类的通用抽象类

[英]Resolve all derived classes of generic abstract class using Autofac

我正在构建一个程序来处理来自各种主题的消息。 由于每个主题的数据不同,我需要专用的类来消耗任何给定主题的数据。 我想这样做是使用一个处理与消息系统通信的基类,以及实现消息处理的派生类:

public abstract class MessageConsumer<T>
{
   public void Start(){/*omitted*/}
   /* Other abstract properties and methods here to support template pattern*/       
}

Start方法将告诉MessageConsumer开始引入新消息。 派生类的示例是:

public class CreatedMessageConsumer : MessageConsumer<CreatedMessage>
{
   /*Implementation omitted*/
}
public class DeletedMessageConsumer : MessageConsumer<DeletedMessage>{}

在上面的代码片段中,我省略了所需的构造函数参数,但很容易想象DiContainer在这里如何有用。 我使用Autofac。 登记CreatedMessageConsumerDeletedMessageConsumer使用Autofac效果很好。

我的问题是如何解决从MessageConsumer<>派生的所有类。 这篇SO文章讨论了如何解析给定的派生类型,但我想解析从MessageConsumer派生的所有类型。 随后我想在所有这些上调用Start方法,例如

foreach(var consumer in container.Resolve<IEnumerable<MessageConsumer<??>>())
{
  consumer.Start();
}

但是,因为我无法提供泛型参数,所以它不会编译。 知道怎么做吗? 我正在使用Autofac 4.2.1。

如果你不关心泛型参数,( 你不会在最后一个代码块中指定一个泛型参数 ),那么:

  • 定义一个接口(使用方法Start)
  • 在你的类型上实现
  • 将其添加到您定义Autofac注册的As链中
  • 解决新界面

更新的代码:

public interface IStartable {
    void Start();
}

public abstract class MessageConsumer<T> : IStartable
{
   public void Start(){/*omitted*/}
   /* Other abstract properties and methods here to support template pattern*/       
}

Caling代码:

foreach(var consumer in container.Resolve<IEnumerable<IStartable>>())
{
  consumer.Start();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM