Как внедрить обработчики событий в события с Unity - PullRequest
5 голосов
/ 13 января 2010

Как добавить (прикрепить) обработчики событий к событиям .net экземпляров, созданных контейнером IoC Unity ?

Пример: у меня есть класс, который сообщает об ошибках через стандартное событие .net:

class CameraObserver
{
    public event Action<Exception> UnhandledException;      
    [...]
}

У меня есть другой класс, который отвечает за обработку этих событий:

class CrashMonitor
{
    public static void HandleException(Exception x)
    { ... }
}

Что я хотел бы сделать, так это автоматически вставлять обработчик из CrashMonitor в каждый экземпляр CameraObserver, как в этом псевдокоде:

UnityContainer container = new UnityContainer();
container.RegisterInstance<Action<Exception>>(CrashMonitor.HandleException)
     .RegisterType<CameraObserver>(new InjectionEvent(UnhandledException));

var observer = container.Resolve<CameraObserver>();
// CrashMonitor.HandleException is now attached to observer.UnhandledException

Есть ли способ сделать это с Unity? Я могу подумать об уродливом обходном пути, таком как наследование от CameraObserver со специальным конструктором, предназначенным для внедрения зависимости или метода. Но это сделало бы систему более сложной (потому что вы должны писать код). Я бы наивно ожидал, что вы можете добавить атрибут [Dependency] к событию, и все должно работать.

1 Ответ

3 голосов
/ 19 января 2010

Я задавал тот же вопрос в группе обсуждения единства на codeplex

http://unity.codeplex.com/Thread/View.aspx?ThreadId=80728

и ответ "нет ничего". Существует демоверсия EventBroker, но она более сложна (автоматическое подключение издателей и подписчиков). Я все еще думаю, что механизм KISS для внедрения событий полезен, и начал делать это сам.

...