У меня есть деликатная проблема, связанная с тем, что у меня есть работающее решение с событиями AutoFac, CommonServiceLocator и домена Udi (http://www.udidahan.com/2009/06/14/domain-events-salvation/). Я позволил Autofac установить ServiceProvider в загрузчике MVC. Но меня раздражают две вещи: 1) События домена вызываются статическим методом, который использует CommonServiceLocator. Это затрудняет модульное тестирование, а также скрывает некоторые функции Autofac, которые мне нравятся. Это приводит меня к... 2) Мои события потребляются IEventSubscriber, где T — это DomainEvent. Но сценарий таков, что мне нравится иметь несколько подписчиков на одно событие. Это означает, что я получаю несколько подписчиков, когда вызываю событие.
IEnumerable<IEventSubscriber<T>> registeredHandlers =
ServiceLocator.Current.GetAllInstances<IEventSubscriber<T>>();
Но я пометил эти экземпляры подписчиков с помощью метаданных через AutoFac:
builder.RegisterType<CreateNewRevisionEvent>().AsImplementedInterfaces()
.WithMetadata<EventSubsriberMetadata>(x => x.For(order => order.Order, 1));
и класс метаданных:
public class EventSubsriberMetadata
{
public int Order { get; set; }
}
Итак, вопрос. Я хотел бы добиться того, чтобы я мог каким-то образом использовать абстрактную фабрику (не решать 1), просто переместить проблему в другое место), AutoFac Delegate Factory (Func‹> не очень доволен дженериками) или просто простая инъекция в диспетчер событий домена?
Что меня убивает, так это то, что я хотел бы избежать зависимостей в сборке Domain.Core. Я знаю, что сегодня у меня есть зависимость от CommonServiceLocator. Но использовать DI в классе Base Entity (то, к чему это приводит), я не знаю простого способа. Я видел демонстрацию Никласа Блумхардта, где AutoFac внедряет DomainEventDispatcher в объекты через перехватчики NHibernate и может отправлять события во время Up/Down в постоянство. Аккуратное решение. Но я использую Entity Framework 5 и тоже надеюсь на более простое решение.
С нетерпением жду ответа или хотя бы обсуждения этой темы. Я думаю, что многие люди останавливаются, когда они подходят к этой проблеме. И, может быть, просто: «Хорошо, мы используем CSL только для событий», и они также устанавливают границы для модульного тестирования. - "Мы пропускаем модульное тестирование для событий". Это не проблема здесь :)
/С наилучшими пожеланиями Магнус