Répondre

7

L'inversion de l'injection de contrôle/dépendance et static ne se mélangent pas bien. Au lieu de cela, procédez comme suit. Avoir un IFooFactory et une mise en œuvre concrète FooFactory:

public interface IFooFactory { 
    Foo Create(); 
} 

public class FooFactory : IFooFactory { 
    public Foo Create() { 
     Foo foo = // create Foo 
     return foo; 
    } 
} 

Ensuite, inscrivez-vous FooFactory que la mise en œuvre concrète de IFooFactory avec ContainerControlledLifeTimeManager de sorte qu'il agit comme un singleton:

IUnityContainer container = new UnityContainer(); 
var manager = new ContainerControlledLifeTimeManager(); 
container.RegisterType<IFooFactory, FooFactory>(manager); 

Ensuite, lorsque vous avez besoin de l'usine :

IFooFactory factory = container.Resolve<IFooFactory>(); 
Foo foo = factory.Create(); 

Si vous ne pouvez pas modifier l'implémentation de votre fait ORY afin qu'il ne puis pas static méthodes que vous devez créer un emballage:

public class FooFactoryWrapper { 
    public Foo Create() { 
     return FooFactoryTypeWithStaticCreateMethod.Create(); 
    } 
} 

puis enregistrez

container.Register<IFooFactory, FooFactoryWrapper>(); 

Bien sûr, vous pouvez vous inscrire FooFactory ou FooFactoryWrapper comme la mise en œuvre concrète de IFooFactory en XML aussi. Faites-moi savoir si vous avez besoin d'aide pour cela.

Le point principal est de s'éloigner de statique.

Cela dit, voici comment vous pouvez enregistrer une usine statique dans l'unité:

IUnityContainer container = new UnityContainer(); 
container.AddNewExtension<StaticFactoryExtension>() 
     .Configure<IStaticFactoryConfiguration>() 
     .RegisterFactory<IFoo>(container => FooFactory.Create()); 
var foo = container.Resolve<IFoo>(); // uses FooFactory 

Je ne peux pas comprendre comment faire cela avec XML et après farfouillé en utilisant réflecteur Je ne pense pas que ce soit possible. Je ne trouve aucune classe dans Microsoft.Practices.Unity.StaticFactory qui pourrait gérer un élément de configuration. Vous devez probablement ajouter votre propre gestionnaire.

+0

Je suis d'accord avec vous là-dessus mais nous essayons de prendre l'ancien code qui utilise Spring.NET et a été implémenté de cette façon. Nous essayons de changer au minimum le code de travail et de remplacer le CIO. Seule raison. Le projet WPF que nous sommes en train de faire est actuellement prévu pour utiliser Unity à cause de Prism et ne pas vouloir écrire un nouveau Bootstrapper. – cjibo

+0

Ok, dans ce cas j'ai ajouté comment enregistrer une méthode d'usine dans Unity. Cependant, je n'arrive pas à comprendre comment le configurer via XML et je ne pense pas que ce soit possible. Vous devrez peut-être créer votre propre gestionnaire. – jason

+0

+1 Pour confirmer que je devrais rester loin des méthodes d'usine statiques si je veux avoir IoC –