Зарегистрировать экземпляр для перехвата в Unity
Для моих модульных тестов я в настоящее время высмеиваю мои перехватчики и перехваченные классы, используя Moq, затем регистрирую перехваченный экземпляр в Unity и устанавливаю перехватчик по умолчанию для интерфейса. Затем я разрешаю экземпляр и вызываю методы перехваченного и проверяю, что метод перехвата вызывается.
_mockInterceptor = new Mock<ExternalInterceptor>().As<IInterceptRelay>();
_mockInterception = new Mock<TestInterception> { CallBase = true }.As<IInterceptRelay>();
Container.RegisterInstance(_mockInterception.Object as ITestInterception);
UnityContainer.Configure<Interception>().SetDefaultInterceptorFor<ITestInterception>(new InterfaceInterceptor());
var test = Container.Resolve<ITestInterception>();
var returnValue = test.TestTheExternalInterception(TestMessage);
_mockInterceptor.Verify(i => i.ExecuteAfter(It.IsAny<object>(), It.IsAny<IEnumerable>(), It.IsAny<LoggingInterceptionAttribute>(), It.IsAny<IMethodResult>()), Times.Once());
Это прекрасно работает, однако я бы предпочел установить перехват во время регистрации, как я делаю, когда я регистрирую сервис / синглтон, чтобы все было согласованно.
// Typical registration
UnityContainer.RegisterType<TFrom, TTo>(new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<PolicyInjectionBehavior>());
// Singleton registration
UnityContainer.RegisterType<TFrom, TTo>(new ContainerControlledLifetimeManager(), new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<PolicyInjectionBehavior>());
Я не вижу способа настроить перехват с помощью IUnityContainer.RegisterInstance()
метод, так как он не требует InjectionMembers
, Я могу на самом деле использовать перехват с экземпляром, если я позвоню UnityContainer.Configure<Interception>().SetDefaultInterceptorFor<T>()
до разрешения.
Есть ли лучший / более простой способ регистрации или издевательства над перехватчиком?
1 ответ
Unity Interception предлагает создавать прокси, не решая их единством. Вы можете тогда RegisterInstance
объект, который вы создали сами.
Для получения дополнительной информации см. Внедрение зависимостей с Unity, стр. 77 "Перехват без контейнера Unity".
Я взял следующий пример отсюда:
ITenantStore tenantStore = Intercept.ThroughProxy<ITenantStore>(
new TenantStore(tenantContainer, blobContainer),
new InterfaceInterceptor(),
new IInterceptionBehavior[]
{
new LoggingInterceptionBehavior(),
new CachingInterceptionBehavior()
});