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