unitycontainer / interception

Unity.Interception package
Apache License 2.0
22 stars 18 forks source link

RegisterFactory with Interceptors #33

Open ArnaudB88 opened 5 years ago

ArnaudB88 commented 5 years ago

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 5 years ago

Yes, it is a new development and still lucks interception support. You can still use old method for the interception.

velsietis commented 5 years ago

@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 5 years ago

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

gdg-cardiff commented 5 years ago

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

ENikS commented 5 years ago

Would you like to discuss it first?

gplutov commented 4 years ago

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>());