2009-06-11 6 views
0

Je voudrais utiliser l'interception avec Unity, voici mon code:interception et l'unité des constructeurs

UnityContainer container = new UnityContainer(); 
container.AddNewExtension<Interception>(); 
container.RegisterType<T, T>(); 
container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor()); 
return container.Resolve<T>(); 

Si T est une exception est levée une classe avec un constructeur avec des paramètres (un un constructeur vide) lorsque J'appelle Resolve, sinon ça marche. Comment intercepter un type qui a un constructeur non vide?

Mise à jour

UnityContainer container = new UnityContainer(); 
container.AddNewExtension<Interception>(); 
container.RegisterType<T, T>(); 
container.Configure<InjectedMembers>().ConfigureInjectionFor<T>(new InjectionConstructor()); 
container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor()); 
return container.Resolve<T>(); 

Ce code fonctionne, mais si je veux utiliser un constructeur avec l'argument?

J'ai essayé ceci:

public static T Resolve<T>(object param) 
{ 
    UnityContainer container = new UnityContainer(); 
    container.AddNewExtension<Interception>(); 
    container.RegisterType<T, T>(); 
    container.Configure<InjectedMembers>().ConfigureInjectionFor<T>(new InjectionConstructor(param)); 
    container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor()); 
    return container.Resolve<T>(); 
} 

Et dans mon code:

var service = Resolve<MyService>(4); 

Je suis de retour avec la même exception que précédemment ...

Répondre

0

Utilisez le InjectionConstructor Attribut tel que décrit here.

+0

Je ne veux pas injecter quoi que ce soit, je veux juste créer l'intercepteur qui appellera le constructeur vide de T. –

1

l'unité choisira le constructeur avec le plus des arguments, vous avez quelques options:

1) Utiliser la configuration pour indiquer l'utilisation du pas de constructeur de arg comme ceci:

Container.Configure<InjectedMembers>() 
    .ConfigureInjectionFor<MyService>(new InjectionConstructor()); 

2) annoter votre objectera

public class MyService 
{ 
    [InjectionConstructor] 
    public MyService() 
    { 
    } 

    public MyService(int arg1) 
    {  
    } 
} 

3) Remplacer les DefaultUnityConstructorSelectorPolicy avec votre propre qui choisit le pas de constructeur de arg si elle existe.

+0

Il fonctionne, mais si je veux utiliser MyService (int arg1) , il jette (voir ma question, j'ai mis à jour) –

Questions connexes