unitycontainer/interception

RegisterFactory with Interceptors

Opened this issue · 6 comments

Hi,

Since the InjectionFactory is deprecated, I am trying to use the RegisterFactory method.
I have registrations which use a factory and also have interceptor(s):

Func<IUnityContainer, object> factoryFunc = c => new FileSystemWithWaitAndRetry(
	new FileSystemService(container.Resolve<System.IO.Abstractions.IFileSystem>()),
	container.Resolve<ILogger>());

container.RegisterType<IFileSystemService>(
	createLifetimeManager(),
	new InjectionFactory(factoryFunc),
	new Interceptor<InterfaceInterceptor>(),
	new InterceptionBehavior(new ImpersonationBehavior(sSettings.ImpersonatorDomain, sSettings.ImpersonatorUsername, sSettings.ImpersonatorPassword, container.Resolve<ILogger>())));

(This is a service for filesystem access with a 'wait and retry' decorator. Interception adds impersonation)

How can the RegisterType be rewritten to RegisterFactory and still pass the InterceptionBehaviour?
Is the RegisterFactory method missing some functionality?

Thanks!

ENikS commented

@ArnaudB88
This can be done with RegisterFactory, but you need to set up the interception proxy as part of your "factoryFunc", which is a bit messy

container.RegisterFactory<IFileSystemService>(c =>
    Intercept.ThroughProxy(
        new FileSystemWithWaitAndRetry(
            new FileSystemService(container.Resolve<System.IO.Abstractions.IFileSystem>()),
            container.Resolve<ILogger>()),
        new InterfaceInterceptor(),
        new[] 
        {  new ImpersonationBehavior(
            sSettings.ImpersonatorDomain, sSettings.ImpersonatorUsername, 
            sSettings.ImpersonatorPassword, container.Resolve<ILogger>())
        }));
ENikS commented

I am open to suggestions on how to make it more elegant.

I'll try and put together a pull request on the weekend

ENikS commented

Is there any about this issue?
Is there an elegant way to RegisterFactory and still pass the InterceptionBehaviour?
I'm working with unity.container, abstractions and interception 5.11.1

Is there a way to do this in 5.11.1:

unityContainer.RegisterType<TestRepository>( new InjectionFactory(container => new TestRepository()), new Interceptor<VirtualMethodInterceptor>(), new InterceptionBehavior<PolicyInjectionBehavior>());