运行时自动绑定绑定

Cra*_*gly 4 .net c# dependency-injection inversion-of-control autofac

我目前使用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);
   }
}
Run Code Online (Sandbox Code Playgroud)

任何有关这方面的帮助将非常感激.

Ste*_*ven 6

你应该使用工厂:

public interface IExportFactory
{
    IExport CreateNewExport(string type);
}
Run Code Online (Sandbox Code Playgroud)

执行:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注册:

builder.Register<IExportFactory>(
    c=> new ExportFactory(c.Resolve<IComponentContext>()))));
builder.RegisterType<HTMLformat>();
builder.RegisterType<PDFformat>();
Run Code Online (Sandbox Code Playgroud)

控制器:

public class HomeController : Controller
{
   IExportFactory factory;

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

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