2017-07-20 4 views
0

Je suis très nouveau pour Autofac et non en mesure de comprendre la syntaxe d'enregistrement. Je suivants calsses/interfaces:Autofac - Enregistrement type d'instance qui prend interface comme paramètre

//Interface 
public interface ISender 
{ 
    void Send(); 
} 


//implementations 
public class Post : ISender 
{ 
    public void Send() 
    { 
     //Post implementation 
    } 
} 

public class Email : ISender 
{ 
    public void Send() 
    { 
     //Email implementation 
    } 
} 

et une classe qui appelle ces implémentations

public class Consumer 
{ 
    ISender Sender; 

    public Consumer(ISender sender) 
    { 
     Sender = sender 
    } 

    public void Act() 
    { 
     Sender.Send(); 
    } 
} 

Maintenant que la mise en œuvre d'appel doit décider dans un contrôleur, donc j'ai essayé d'utiliser iIndex de this page comme :

public calss PostController 
{ 
    Consumer ConsumerObject; 
    public PostController(IIndex<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer["post"]; 
    } 

} 

public class EmailController 
{ 
    Consumer ConsumerObject; 
    public PostController(IIndex<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer["email"]; 
    } 
} 

Premièrement, est-ce correct ou faisable? Maintenant, le problème est que je ne comprends pas comment s'inscrire dans Autofac. Alors, comment pouvons-nous enregistrer Consumer et ISender dans Autofac? S'il vous plaît suggérer s'il y a une meilleure/alternative.

Répondre

0

La façon d'enregistrer les composants dans Autofac est décrit largement dans la documentation here. Et comment utiliser les services avec clé est décrit dans la documentation que vous avez liée.

Fondamentalement, vous devez créer ContainerBuilder, enregistrer tous vos composants et construire le conteneur lui-même, en fonction du type de projet que vous avez.

Dans votre situation, vous devez utiliser les inscriptions suivantes:

var builder = new ContainerBuilder(); 
builder.RegisterType<Post>().Keyed<ISender>("post"); 
builder.RegisterType<Email>().Keyed<ISender>("email"); 
builder.RegisterType<Consumer>(); 

Si vous utilisez ASP.NET WebAPI (je suppose que sur la base du fait que vous utilisez les contrôleurs), vous devez vous enregistrer vos contrôleurs

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

ou pour MVC

builder.RegisterControllers(typeof(MvcApplication).Assembly); 

maintenant, il y a différentes façons pour choisir le Consumer avec l'implémentation correcte ISender (je suppose que vous voulez choisir l'implémentation correcte dans le contrôleur).

On serait d'injecter IIndex<string, ISender>-Consumer classe et passer la chaîne clé qui lui est propre ainsi:

public class Consumer 
{ 
    ISender Sender; 

    public Consumer(string type, IIndex<string, ISender> sender) 
    { 
     Sender = sender[type]; 
    } 

    public void Act() 
    { 
     Sender.Send(); 
    } 
} 

Ensuite, dans le contrôleur, vous pouvez utiliser l'injection Func:

public class PostController 
{ 
    Consumer ConsumerObject; 
    public PostController(Func<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer("post"); 
    } 
} 

public class EmailController 
{ 
    Consumer ConsumerObject; 
    public EmailController(Func<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer("email"); 
    } 
} 

Une autre pourrait enregistrer deux fois Consumer avec la méthode Register et résoudre ISender en heure d'enregistrement.