Зарегистрировать экземпляр для перехвата в 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()
    });
Другие вопросы по тегам