【问题标题】:Autofac Binding at Runtime运行时 Autofac 绑定
【发布时间】:2012-05-23 20:06:27
【问题描述】:

我目前使用 Autofac 进行简单的构造函数注入,没有任何问题。但是我想知道的是如何在运行时解决依赖关系。下面的示例显示了我们可以导出文档的多种方式。通过简单的构造函数注入,IExport 的具体实现在运行时被解析。然而,需要做的是从下拉列表中解决用户选择的 IExport,这将在我的容器构建之后发生。有没有什么例子可以说明我如何做到这一点?

Public interface IExport
{
   void Run(string content);
}

public class PDFformat : IExport
{ 
   public void Run(string content)
   {
       // export in pdf format
   }
}

public class HTMLformat : IExport
{
   public void Run(string content)
   {
       // export in html format
   }
}

public class RTFformat : IExport
{  
   public void Run(string content)
   {
       // export in rtf format
   }
}

public class HomeController : Controller
{
   IExport Export;

   public HomeController(IExport export)
   {
      Export = export;
   }

   public void ExportDocument(string content)
   {
      Export.Run(content);
   }
}

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net dependency-injection inversion-of-control autofac


    【解决方案1】:

    你应该使用工厂:

    public interface IExportFactory
    {
        IExport CreateNewExport(string type);
    }
    

    实施:

    class ExportFactory : IExportFactory
    {
        private readonly IComponentContext container;
    
        public ExportFactory(IComponentContext container)
        {
            this.container = container;
        }
    
        public IExport CreateNewExport(string type)
        {
            switch (type)
            {
                case: "html":
                    return this.container.Resolve<HTMLformat>();
                // etc
            }
        }
    }
    

    注册:

    builder.Register<IExportFactory>(
        c=> new ExportFactory(c.Resolve<IComponentContext>()))));
    builder.RegisterType<HTMLformat>();
    builder.RegisterType<PDFformat>();
    

    控制器:

    public class HomeController : Controller
    {
       IExportFactory factory;
    
       public HomeController(IExportFactory factory)
       {
          this.factory = factory;
       }
    
       public void ExportDocument(string content)
       {
          this.factory.CreateNew("html").Run(content);
       }
    }
    

    【讨论】:

    • 因此我会在我的控制器中传入 IExportFactory 吗?当我按照 builder.Register( container => new ExportFactory(container)); 在注册中传递容器时我收到以下错误无法从“Autofac.IComponentContext”转换为“Autofac.IContainer”
    • @Cragly:对不起。我不是 Autofac 专家。您可能需要注入 IComponentContext(请参阅我的更新)。是的,您需要将IExportFactory 注入您的HomeController
    • 谢谢,通过以下注册修改 -> builder.Register( container => new ExportFactory(container.Resolve()));
    • 请参考alexmg.com/…以获得更具体的解决方案。
    • 我在 azure 函数中使用过这个东西。非常感谢
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多