我试图创建一个简单的内存总线实现,其中构造函数可以将管道作为参数,即
public Bus(Action<IMessage, Action<IMessage>> eventPipeline)
{
_eventPipeline = eventPipeline;
}
其中IMessage
是一个空接口(用于IEvent
和ICommand
的公共接口)。
然后我有一个装饰器,我想成为管道的一部分(即每次我们在调用特定事件的事件处理程序被调用之前将事件发布到总线上时应该调用它):
public class HttpAuditDecorator<T> : IDecorator<T> where T : IAuditable, IMessage
{
private ILogger _logger = Logging.Logger;
public void Handle(T msg, Action<IMessage> next)
{
...
next(msg);
}
}
此处IAuditable
是另一个与IMessage
无关的界面。 IDecorator
是
public interface IDecorator<T> where T : IMessage
{
void Handle(T msg, Action<IMessage> next);
}
尝试实例化总线时出现问题:
public static Bus Bootstrap()
{
Instance = new Bus((@event, next) => new HttpAuditDecorator<T>().Handle((IAuditable)@event, next));
...
}
问题是在T
的地方写什么。我想以某种方式告诉T
实施IAuditable
和IMessage
。当然,可以创建一个继承自两者的新界面,但我更希望避免这种情况。