Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 611
imnotaduck Avatar asked Apr 17 '26 20:04

imnotaduck


1 Answers

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.

like image 165
tdragon Avatar answered Apr 19 '26 10:04

tdragon