6

私は現在 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);
   }
}

これに関するヘルプは大歓迎です。

4

1 に答える 1

8

ファクトリを使用する必要があります。

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);
   }
}
于 2012-05-23T10:16:36.573 に答える