Existe-t-il un moyen via une configuration xml pour indiquer une méthode d'usine statique sur un objet?Unity IOC Static Factories
Répondre
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.
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
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
+1 Pour confirmer que je devrais rester loin des méthodes d'usine statiques si je veux avoir IoC –