L'accès ou obtenir de l'Autofac Conteneur à l'intérieur d'une classe statique
J'ai besoin d'obtenir ou de l'accès à mon conteneur IoC dans une classe statique. C'est mon (simplifié) scénario:
- Je enregistrer des dépendances pour les ASP .net Api Web dans une start-up de la classe (mais aussi je le fais pour le MVC ou WCF. J'ai un DependecyResolver projet, mais pour des raisons de simplicité, considérons le code suivant)
//Web Api project - Startup.cs
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
var builder = new ContainerBuilder();
//... Omited for clarity
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.AsClosedTypesOf(typeof(IHandle<>))
.AsImplementedInterfaces();
//...
IContainer container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
//...
}
Puis, dans une catégorie distincte de la bibliothèque, j'ai ma classe statique (encore simplifié pour plus de clarté):
public static class DomainEvents
{
private static IContainer Container { get; set; }
static DomainEvents()
{
//Container = I need get my Autofac container here
}
public static void Register<T>(Action<T> callback) where T : IDomainEvent { /* ... */ }
public static void ClearCallbacks() { /* ... */ }
public static void Raise<T>(T args) where T : IDomainEvent
{
foreach (var handler in Container.Resolve<IEnumerable<IHandle<T>>>())
{
handler.Handle(args);
}
//...
}
}
Une idée de comment puis-je l'obtenir?
OriginalL'auteur Jose Alonso Monge | 2015-11-27
Vous devez vous connecter pour publier un commentaire.
Oui, vous n'avez pas! Sérieusement. Le modèle avec la statique
DomainEvents
classe provient de l'Udi Dahan, mais même Udi a admis que c'était une mauvaise conception. Les classes statiques qui nécessitent des dépendances de leur propre sont extrêmement douloureux pour travailler avec. Ils font le dur du système de test et la maintenance.Au lieu de cela, créer un
IDomainEvents
l'abstraction et d'injecter de la mise en œuvre de cette abstraction dans des classes qui nécessitent la publication d'événements. Cela résout complètement le problème.Vous pouvez définir votre
DomainEvents
classe comme suit:Et vous pouvez vous inscrire à cette classe comme suit:
IHandle
types dans leRaise
méthode? Ai-je besoin pour injecter tout leIHandle
de tous les types dans laDomainEvents
ctor? thxPour l'instant, je résoudre mon problème de réglage DomainEvents comme classe générique (
public class DomainEvents<T> : IDomainEvents<T> where T : IDomainEvent
) et de l'injecter dans ctor unIEnumerable<IHandle<T>> parameter
. Je ne sais pas si c'est la meilleure solution ou pas, mais il fonctionne bien pour l'instantVoir ma mise à jour.
Finalement j'ai choisi cette mise en œuvre.
OriginalL'auteur Steven
Vous pouvez créer une méthode statique à l'intérieur de votre
DomainEvents
classe pour injecter le conteneur comme ceci:Et puis, à partir de votre ASP.NET demande, appelez cette méthode pour injecter le conteneur:
Veuillez noter que je vous donne une réponse directe à votre question. Cependant, voici quelques questions que je vois avec ce:
Attention. La solution ne fonctionne pas (à moins de ne pas être prévisible). Notez que vous êtes de passage le conteneur racine de la DomainEvent classe. Alors que dans MVC ou de fil, nouvelles de l'enfant étendues seront créées et de celles qui sont ce à quoi vous avez besoin, sinon vous risquez d'avoir des problèmes avec DbContexts ou ISessions (par exemple à l'aide d'une entité à partir d'un contexte créé à la MVC du champ d'application puis de l'utiliser à l'intérieur de l'événement, qui est lié à l'objectif principal, et probablement différents DbContext).
OriginalL'auteur Yacoub Massad