. , . :
<!-- language: c# -->
container.Register<IMessageHandler<FooMessage>, FooHandler>();
container.Register<IMessageHandler<BarMessage>, BarHandler>();
. IMessageHandler<T>.
, , . DI . , - . , :
container.RegisterManyOpenGeneric(typeof(MessageHandler<>),
typeof(MessageHandler<>).Assembly);
, MessageHandler<T> , MessageHandler<T>. , , .
, . , DI.
, , IMessageProcessor, Message:
public interface IMessageProcessor
{
void Process(Message message);
}
DI IMessageProcessor, :
<!-- language: c# -->
private class DIMessageProcessor : IMessageProcessor
{
private readonly Container container;
public DIMessageProcessor(Container container)
{
this.container = container;
}
public void Process(Message message)
{
if (message == null) throw new ArgumentNullException("message");
Type messageType = message.GetType();
Type handlerType =
typeof(IMessageHandler<>).MakeGenericType(messageType);
var handler = this.container.GetInstance(handlerType);
handlerType.GetMethod("Handle").Invoke(handler, message);
}
}
. , . , , ( ). IMessageProcessor. , DIMessageProcessor unit test ( ).
DIMessageProcessor, . , :
container.RegisterSingle<IMessageProcessor>(new DIMessageProcessor(container));
IMessageProcessor , . WCF:
<!-- language: c# -->
[ServiceKnownType("GetKnownMessageTypes")]
public class WCFMessageService
{
private readonly IMessageProcessor processor;
public WCFMessageService()
{
this.processor =
Global.Container.GetInstance<IMessageProcessor>();
}
[OperationContract]
public void Process(Message message)
{
this.processor.Process(message);
}
public static IEnumerable<Type> GetKnownMessageTypes(
ICustomAttributeProvider provider)
{
var knownMessageTypes =
from type in typeof(Message).Assembly.GetTypes()
where typeof(Message).IsAssignableFrom(type)
select type;
return knownMessageTypes.ToArray();
}
}
, .