我正在研究产品导入模块(nopcommerce3.9插件),我有100多个不同的导入格式(带有不同flyed的Excel文件)。因此,我已经使用导入方法创建了一个IFORMAT接口,因此每个新格式类都将实现IFORMAT并为导入提供自己的逻辑
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();
}
}
导入操作执行时,它将从config读取当前格式。并将其传递到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);
}
}
}
现在,是否有任何方法可以从工厂删除开关语句。我可以使用反射来做到这一点,但是格式类具有其他依赖项(在实际代码中)。因此,是否有任何方法可以在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");
}
}
autoFac支持命名服务,在此处查看:http://docs.autofac.org/en/latest/advanced/keyed-services.html
注册
builder.RegisterType<Format_A>().Named<IFormat>("xls");
解决
var impl = container.ResolveNamed<IFormat>("xls");