[英]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。 登记CreatedMessageConsumer
和DeletedMessageConsumer
使用Autofac效果很好。
我的问题是如何解决从MessageConsumer<>
派生的所有类。 这篇SO文章讨论了如何解析给定的派生类型,但我想解析从MessageConsumer
派生的所有类型。 随后我想在所有这些上调用Start
方法,例如
foreach(var consumer in container.Resolve<IEnumerable<MessageConsumer<??>>())
{
consumer.Start();
}
但是,因为我无法提供泛型参数,所以它不会编译。 知道怎么做吗? 我正在使用Autofac 4.2.1。
如果你不关心泛型参数,( 你不会在最后一个代码块中指定一个泛型参数 ),那么:
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.