Autofac を使用してコンソール アプリの Main エントリ ポイントに依存関係を挿入する

あなたがすべきことは、すべてのロジックをメインからクラスに抽出することです。このクラスは、依存関係を持つコンストラクターを持つことができます。このクラスをメインで解決して呼び出します。このクラスは、アプリケーション全体と見なす必要があります。 . Program 内で発生するすべてのこと class をコンポジション ルートと見なすことができるようになりました。

// Begin composition root
public static class Program
{
    public static void Main(string[] args) 
    {
        var container = ConfigureContainer();
        var application = container.Resolve<ApplicationLogic>();

        application.Run(args); // Pass runtime data to application here
    }

    private static IContainer ConfigureContainer()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<ApplicationLogic>.AsSelf();
        builder.RegisterType<Log>().As<ILog>();
        // Register all dependencies (and dependencies of those dependencies, etc)

        return builder.Build();
    }
}
// End composition root

public class ApplicationLogic
{
    private readonly ILog log;

    public ApplicationLogic(ILog log) {
        this.log = log;
    }

    public void Run(string[] args) {
        this.log.Write("Hello, world!");
    }
}

container.Resolve<ApplicationLogic>() に注意してください だけではない ApplicationLogic を解決する クラス、オブジェクト グラフ全体を解決します。 すべてを含む ApplicationLogic の の依存関係、およびそれらの依存関係の依存関係など、グラフの深さに関係なく。あなたが責任を持つ唯一のことは、それらの依存関係を ConfigureContainer() に登録することです 方法。したがって、1 つ以上の Resolve() を持つことは、やや珍しいことです。 メソッドはコンソール アプリケーションを呼び出します。存在する場合は、常にコンポジション ルート内で呼び出すか接続する必要があります。


どこかにコンテナを構成する必要があります .コンソール アプリでは、Main()


builder.RegisterType.AsSelf(); を変更する必要がありました builder.RegisterType().AsSelf(); に これを機能させるには