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

时间:2017-11-10 15:31:10

标签: c# 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。使用Autofac注册CreatedMessageConsumerDeletedMessageConsumer效果很好。

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

之类的东西
foreach(var consumer in container.Resolve<IEnumerable<MessageConsumer<??>>())
{
  consumer.Start();
}

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

1 个答案:

答案 0 :(得分:3)

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

  • 定义界面(使用方法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 code:

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