0

Je travaille sur le module d'importation de produits (plugin NopCommerce3.9), j'ai plus de 100 formats d'importation différents (fichier Excel avec différents flied). J'ai donc créé une interface iformat avec la méthode d'importation de sorte que chaque nouvelle classe de format mettra en œuvre la iformat et de fournir leur propre logique pour l'importationComment enregistrer et résoudre de nombreuses classes à une interface dans Autofac Dependency injection Framework

interface IFormat 
{ 
    bool Import(file) 
} 

class Format_A : IFormat 
{ 
public bool Import(file) 
    //import with A format 
} 

class Format_B : IFormat 
{ 
public bool Import(file) 
    //import with B format 
} 

Je me suis inscrit le type/classe sur autofac formats comme ci-dessous

public class DependencyRegistrar 
{ 
    public virtual void Register(Autofac_Container builder) 
    { 
      builder.RegisterType<Format_A>().AsSelf().InstancePerLifetimeScope(); 
      builder.RegisterType<Format_B>().AsSelf().InstancePerLifetimeScope(); 
    } 
} 

Lorsque l'action d'importation s'exécute, le format actuel est lu à partir de la configuration. et passez-le à la méthode FormatFactory.GetFormat(). Le FormatFactory va résoudre/créer une nouvelle base d'objet sur le paramètre de format passé.

public ActionResult ImportExcel() 
{ 
    var format=format_from_config; 
    var file = Request.InputStream; 
    IFormat currentFormat = FormatFactory.GetFormat(format); 
    bool success = currentFormat.Import(file); 
    return Json(new { success = success }); 
} 

utilisant le cadre de la dépendance Autofac

class FormatFactory 
{ 
    public static IFormat GetFormat(string format) 
    { 
     switch (format) 
     { 
      case "Format_A": 
       return Autofac_Container.Resolve<Format_A>(); 
      case "Format_B": 
       return Autofac_Container.Resolve<Format_B>(); 
      default: 
       throw new ArgumentException($"No Type of {nameof(format)} found by factory", format); 
     } 
    } 
} 

Maintenant, est-il possible de supprimer l'instruction switch de l'usine. Je pourrais le faire en utilisant la réflexion mais les classes Format ont d'autres dépendances (en code réel). Donc, y at-il un moyen de réaliser cela dans Autofac, de même que je peux résoudre le type par le nom de la chaîne de la classe. je veux quelque chose comme ci-dessous le code

public class DependencyRegistrar 
    { 
     public virtual void Register(Autofac_Container builder) 
     { 
       builder.RegisterType<Format_A>().As<IFormat>().Resolve_If_String_Name_like("Format_A").InstancePerLifetimeScope(); 
       builder.RegisterType<Format_B>().As<IFormat>()Resolve_If_String_Name_like("Format_B").InstancePerLifetimeScope(); 
     } 
    } 
------------------------------------------------------------------- 
class FormatFactory 
{ 
    public static IFormat GetFormat(string format) 
    { 
     return Autofac_Container.Resolve<IFormat>("Format_A"); 
    } 
} 

Répondre