Question

Autofac a des modules, Windsor a des installateurs et des registres structuremap ... avec un injecteur simple comment puis-je emballer la logique de configuration en classes réutilisables?

J'ai essayé:

public interface IModule { }

public class FooModule : IModule
{
    public FooModule(SimpleInjector.Container container)
    {
        container.RegisterSingleton<IBar, Bar>();
        container.RegisterSingleton<IFoo, Foo>();
    }
}

Et je l'utilise dans la racine de composition:

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();
    container.RegisterCollection<IModule>(new FooModule(container));
    ...
}

Cependant, FooModule dépend du conteneur et peut-être pas de bonne pratique ... voir http://code.google.com/p/autofac/wiki/bestpractices:

Si les composants sont dépendants du conteneur, regardez comment ils utilisent le conteneur pour récupérer les services et ajoutez ces services aux arguments de constructeur (dépendance injectés) du composant à la place.

Était-ce utile?

La solution

Une fonctionnalité «module» est délibérément exclue de la bibliothèque de noyau d'injecteur simple, mais il y a un SimpleInjector.Packaging Nuget Package Cela vous permet de le faire. «Package» est le terme injecteur simple. Cette bibliothèque n'est cependant rien de plus qu'un IPackage interface et deux méthodes d'extension. Vous pouvez réaliser la même chose en écrivant du code comme ceci:

Un paquet:

public static class BootstrapperPackage
{
    public static void RegisterServices(Container container)
    {
        container.Register<IBar, Bar>(Lifestyle.Scoped);
        container.Register<IFoo, Foo>(Lifestyle.Singleton);            
    }
}

Dans votre racine de composition:

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();

    BootstrapperPackage.RegisterServices(container);

    ...
}

La différence avec le SimpleInjector.Packaging Nuget Package est que ce package définit une interface pour vous et vous permet de charger dynamiquement plusieurs packages en une seule ligne:

public class BusinessLayerPackage : IPackage
{
    public void RegisterServices(Container container)
    {
        container.Register<IBar, Bar>(Lifestyle.Scoped);
        container.Register<IFoo, Foo>(Lifestyle.Singleton);            
    }
}

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();

    container.RegisterPackages(AppDomain.CurrentDomain.GetAssemblies());
}

Cependant, si vous n'avez pas vraiment besoin de chargement dynamique, l'utilisation de méthodes statiques (comme indiqué ci-dessus) est préférée, car elle présente les avantages suivants:

  • Rend les modules de chargement très explicites et découvrables.
  • Facilite la sélection des modules à charger et lesquels non.
  • Facilite la transmission des valeurs supplémentaires au RegisterServices Méthodes, telles que les valeurs de configuration dont ce module nécessite. Cela empêche le module de prendre une forte dépendance au système de configuration.

Pour plus d'informations, veuillez lire cette.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top