-, , . , , .
, , ; IMessageHandler<TMessage>:
public interface IMessageHandler<TMessage>
{
void Handle(TMessage message);
}
, , . , :
public interface IWindow<TMessage>
{
void ShowDialog();
}
, , , ( MVVMLight, ):
public interface IMessageDispatcher
{
void Dispatch(object message);
}
IMessageHandler<TMessage>, , ShowEmailPopupFormMessage:
public class ShowEmailPopupFormMessageHandler : IMessageHandler<ShowEmailPopupFormMessage>
{
private readonly IWindow<ShowEmailPopupFormMessage> frm;
public ShowEmailPopupFormMessageHandler(IWindow<ShowEmailPopupFormMessage> frm) {
this.frm = frm;
}
public void Handle(ShowEmailPopupFormMessage message) {
Messenger.Send(msg.Params);
frm.ShowDialog();
}
}
EmailPopupWindow ShowEmailPopupFormMessage, IWindow<ShowEmailPopupFormMessage>:
public class EmailPopupWindow : Window, IWindow<ShowEmailPopupFormMessage>
{
// window stuff here
}
, , :
container.Register(typeof(IWindow<>), applicationAssemblies);
container.Register(typeof(IMessageHandler<>), applicationAssemblies);
container.RegisterSingleton<IMessageDispatcher>(
new SimpleInjectorMessageDispatcher(container));
container.RegisterInitializer<Window>(frm => {
frm.Unloaded += FormOnUnloaded;
});
, IWindow<T> IMessageHandler<T> . , Window.Unload .
SimpleInjectorMessageDispatcher :
private sealed class SimpleInjectorMessageDispatcher : IMessageDispatcher
{
private readonly Container container;
public SimpleInjectorMessageDispatcher(Container container) {
this.container = container;
}
public void Dispatch(object message) {
Type handlerType = typeof(IMessageHandler<>).MakeGenericType(message.GetType());
dynamic handler = this.container.GetInstance(handlerType);
handler.Handle((dynamic)message);
}
}
, ( ), , , , , . , , , ( ) . ; SOLID. ( ).