如何在AUTOFAC依赖注入框架中注册并解析许多类接口



我正在研究产品导入模块(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");

相关内容

  • 没有找到相关文章

最新更新