Type générique de registre d’unité pour interface non générique

mon scénario me semble très simple, mais je n’ai pas trouvé de solution.

J’ai ce scénario

public class Class : IInterface where T : class { } 

l’interface ne peut pas être générique (provenant de WCF lib.)

donc je veux enregistrer l’interface comme ça

 container.RegisterType(typeof (IInterface ), typeof (Class)); 

et puis le résoudre avec T

Comment puis-je le faire? Qu’est-ce que je rate?

mon intention est de faire quelque chose comme

 container.Resolve(/* specify T */); 

Si vous n’avez pas besoin de résoudre à l’aide de l’interface non contrôlée, vous pouvez créer votre propre interface contrôlée utilisant des génériques et dérivée de l’interface non contrôlée. Ensuite, vous pouvez enregistrer le générique ouvert et résoudre les types génériques fermés.

 public interface IControlled : IUncontrolled {} public class Controlled : IControlled {} container.RegisterType(typeof(IControlled<>), typeof(Controlled<>)); IUncontrolled instance = container.Resolve>(); 

Qu’est-ce que je rate?

Il vous manque une usine.

Pensez-y, il n’y a pas de lutins magiques travaillant sur le fond, devinant le type dont vous avez besoin. Vous devez le fournir. Soit en indiquant explicitement ce que T est en configurant comme ceci:

 container.RegisterType( typeof(IInterface), typeof(Class)); 

Ou en créant une usine où vous transmettez le T au moment de l’exécution:

 public interface IInterfaceFactory { IInterface Create(); } 

L’usine peut être enregistrée comme suit:

 container.RegisterInstance( new InterfaceFactory(container)); 

Et une implémentation peut ressembler à:

 public class InterfaceFactory : IInterfaceFactory { private readonly IUnityContainer container; public InterfaceFactory(IUnityContainer container) { this.container = container; } public IInterface Create() { return this.container.Resolve>(); } } 

Vous pouvez maintenant injecter IInterfaceFactory aux consommateurs devant travailler avec IInterface . Ils peuvent également demander la version dont ils ont besoin en appelant la méthode Create() .

METTRE À JOUR

Si vous pensez que c’est trop de code, vous pouvez également enregistrer un délégué d’usine comme suit:

 container.RegisterInstance>( type => container.Resolve( typeof(Class<>).MakeGenericType(type))); 

C’est fondamentalement la même chose, mais elle est maintenant intégrée dans un délégué. Vos consommateurs peuvent désormais compter sur un Func au lieu d’un IInterfaceFactory et transmettre une instance de type au délégué.

IInterfaceFactory je préfère utiliser une interface descriptive telle que IInterfaceFactory . C’est à vous.