c# - 运行时的 Autofac 绑定(bind)

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

我目前使用 Autofac 进行简单的构造函数注入(inject),没有任何问题。但是我想知道的是如何在运行时解决依赖关系。下面的示例显示了我们可以导出文档的多种方式。通过简单的构造函数注入(inject),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);
   }
}

如有任何帮助,我们将不胜感激。

最佳答案

你应该使用工厂:

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

Controller :

public class HomeController : Controller
{
   IExportFactory factory;

   public HomeController(IExportFactory factory)
   {
      this.factory = factory;
   }

   public void ExportDocument(string content)
   {
      this.factory.CreateNew("html").Run(content);
   }
}

关于c# - 运行时的 Autofac 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10717553/

相关文章:

c# - 如何使用 Sitecore 和 Webforms For Marketers (WFFM) 解决验证码图像丢失问题?

c# - 在外部命名空间中引用方法/变量是否比完全包含它更节省内存?

c# - CsvHelper ConvertUsing 不改变输出

c# - 如何使 DataContractJsonSerializer 将对象序列化为字符串?

java - Roboguice 未注入(inject)对象并导致空指针异常

c# - 组合 Func<bool> 表达式

c# - 从 CngKey 或 X509Certificate(2) 实例生成 CSR

javascript - 如何从 iframe 父页面获取类值

c# - CaSTLe Windsor Ms Adapter Core 2.0 实现

android - Android 上的 Dagger 2 : inject same dependency in Activity and retained Fragment