Ich habe (nicht-polymorphe) Nachrichten, die ich nach ihrem MessageType-Feld behandeln möchte. Es ist nahe dem Befehlsmuster hier diskutiert (und die ich die Arbeit mit Tests):Wie Schloss Windsor Befehl/Handler basierend auf Nachrichteninhalt (nicht Laufzeittyp)
- Castle Windsor & Command Pattern
- Windsor registration for generic commands/command handlers
- http://kozmic.net/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more/
execpt, ich habe keine separate Klassen oder generische Typen für jede MessageType
. Ich würde es vorziehen, solche Typen (Legacy-Gründe) nicht einführen zu müssen.
Etwa wie:
public interface IMessage {
int MessageType { get; }
IList<byte> Payload { get; }
}
class Message: IMessage {
// Implementation
}
public interface IHandler {
void Handle(IMessage message);
}
public abstract class TypedMessageHandler: IHandler {
public abstract int RequiredMessageType { get; }
public virtual void Handle(IMessage message) {
if (message.CommandType != RequiredMessageType)
throw new ArgumentException(nameof(message)) // More info :)
InnerHandle(message);
}
protected abstact void InnerHandle(IMessage message);
}
class MessageType0Handler: TypedMessageHandler {
public int RequiredMessageType => 0;
override void InnerHandle(IMessage message) => // Do stuff;
}
class MessageType1Handler: TypedMessageHandler {
public int RequiredMessageType => 1;
override void InnerHandle(IMessage message) => // Do stuff;
}
// Some registration that I can use to dispatch from `msg: IMessage` to
// `IHandler` with `RequiredMessageType == msg.MessageType`.
Wie kann ich diese Depesche mit Windsor zu tun? Vorzugsweise mit einigen Registrierungen basierend auf Abfragen der definierten Typen.
Der Trick mit einer TypedFactory aus den obigen Artikeln ist nicht sofort nützlich.
Ich spiele mit den Handler mit benutzerdefinierten Attributen Tagging, aber ich kann nicht herausfinden, wie man beide:
- Holen Sie sich das Befehlsargument (IMessage-Instanz), und
- Verwenden Sie einen benutzerdefinierten IHandlerSelector, um die IHandler-Implementierungen basierend auf einem solchen Attribut zu filtern.
Ich habe eine Arbeitslösung bei github.com/slogen/WindsorTests/blob/master/WindsorTests/..., aber ich mag es nicht :) Es verschiebt den Parameter aus dem Griff() aufrufen, an den Konstruktor die IHandler-Instanz (die für mich OK ist) Aber es erfordert einige "Tricks" für die Registrierung. –