Search code examples
c#ninjectautofac

Convert Ninject Modules to Autofac


I'm learning now .NetCore and Autofac and I have a doubt about how to convert Ninject Modules to Autofac Modules.

Let's see some code:

Module:

using Ninject.Modules;

namespace v0.CrossCutting.Ninject.Domain.Data
{
    using v0.Domain.Data.Model.Interfaces;
    using v0.Domain.Data.Model.Classes;

    public class Model : NinjectModule
    {
        public override void Load()
        {
            try
            {
                Bind<IConfig>().To<Config>();
            }
            catch
            {
                throw;
            }
        }
    }
}

Register:

using Ninject;
using Ninject.Modules;

namespace v0.CrossCutting.Ninject
{
    public static class Container
    {
        private static IKernel Kernel;

        static Container()
        {
            INinjectModule[] NinjectModules = new INinjectModule[]
            {
                new Domain.Data.Model()
            };

            Kernel = new StandardKernel(NinjectModules);
        }

        public static TModel Resolve<TModel>()
        {
            try
            {
                return Kernel.Get<TModel>();
            }
            catch
            {
                throw;
            }
        }
    }
}

I searched on internet and another stack overflow questions but I still couldn't figure it out how to do it.

Thanks.


Solution

  • Autofac Modules are described in Autofac documentation. I am not very familiar with Ninject, but it seems you are trying to achieve something like this:

    The module class must implement Autofac's Module class and override Load method, similarly to Ninject:

    public class ModelModule : Module
    {
        public override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<Config>().As<IConfig>();
        }
    }
    

    Later on, you have to register your module within container itself:

    public class ContainerConfig
    {
        public IContainer ConfigureAutofac()
        {
            var containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterModule(new ModelModule());
    
            return containerBuilder.Build();
        }
    }
    

    Btw, static Container class with public and static Resolve method is considered an anti-pattern and should be avoided.