0

我正在處理產品導入模塊(NopCommerce3.9插件),我有100 +不同的導入格式(不同的飛行Excel文件)。與導入方法,所以我已經創建了一個IFormat接口,因此每個新格式類將實現IFormat和進口提供自己的邏輯如何註冊和解決Autofac依賴注入框架中的許多類到一個接口

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 
} 

我已經註冊的格式類型上autofac /類,如下

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

當導入Action執行時,它會從配置中讀取當前格式。並將其傳遞給FormatFactory.GetFormat()方法。

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 }); 
} 

FormatFactory將根據傳遞的格式參數來解析/創建新的對象庫。 使用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); 
     } 
    } 
} 

現在,有什麼辦法可以從工廠去除switch語句。我可以使用反射來做,但Format類有其他的依賴關係(在實際的代碼中)。那麼,有沒有什麼辦法可以在Autofac中實現這一點,同樣我可以通過類的字符串名稱來解析類型。 我想要的東西,像下面的代碼

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"); 
    } 
} 

回答