IoC-контейнер Autofac

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

IoC-контейнер Autofac предоставляет аналогичную функциональность, что и Ninject, предлагая альтернативный способ внедрения зависимостей.

Возьмем тот же пример с репозиторием:

interface IRepository
{
	// определение методов
}
public class BookRepository : IDisposable, IRepository
{
    private BookContext db = new BookContext();

    public BookRepository()
    {
    }
	// определение методов
}

И пусть у нас будет тот же контроллер:

public class HomeController : Controller
{
    IRepository repo;
    public HomeController(IRepository r)
    {
        repo = r;
    }
    public ActionResult Index()
    {
        return View(repo.List());
    }
}

Используем для установки зависимостей IoC-контейнер Autofac. Для этого добавим в проект через NuGet два пакета: Autofac и Autofac ASP.NET MVC 5 Integration:

Внедрение зависимостей с Autofac в ASP.NET MVC

Каждый из этих пакетов надо устанавливать отдельно.

После добавления Autofac определим в проекте, например, в какой-нибудь дополнительной папке Util новый класс AutofacConfig:

using Autofac;
using Autofac.Core;
using Autofac.Integration.Mvc;
using System.Web.Mvc;

public class AutofacConfig
{
    public static void ConfigureContainer()
    {
		// получаем экземпляр контейнера
        var builder = new ContainerBuilder();

        // регистрируем контроллер в текущей сборке
        builder.RegisterControllers(typeof(MvcApplication).Assembly);

		// регистрируем споставление типов
        builder.RegisterType<BookRepository>().As<IRepository>();
		
		// создаем новый контейнер с теми зависимостями, которые определены выше
        var container = builder.Build();

        // установка сопоставителя зависимостей
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

Класс AutofacConfig определяет один статический метод ConfigureContainer(), который и выполняет всю настройку.

После этого остается вызвать данный метод в global.asax:

protected void Application_Start()
{
    AutofacConfig.ConfigureContainer();

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Установка параметров и свойств

Как и Ninject, Autofac предоставляет возможность устанавливать параметры и свойства у зависимостей. Например, класс репозитория принимает параметр:

public class BookRepository : IDisposable, IRepository
{
    private BookContext db;
    public BookRepository(BookContext context)
    {
            db = context;
    }
}

Для установки параметров используется метод WithParameter:

builder.RegisterType<BookRepository>()
        .As<IRepository>()
        .WithParameter("context", new BookContext());

Первым параметром в метод передается название параметра, а вторым - значение для него. Если у нас используется несколько параметров (например, public BookRepository(BookContext context, string connectionStr)), то применяется метод WithParameters():

builder.RegisterType<BookRepository>()
    .As<IRepository>()
    .WithParameters(new List<Parameter> { new NamedParameter("context", new BookContext()), 
        new NamedParameter("connectionStr", "fvdsfffgf") });

Для установки зависимостей в свойствах применяются методы WithProperty/WithProperties, деействие которых аналогично. Например, в репозитории есть свойство:

public class BookRepository : IDisposable, IRepository
{
    private BookContext db;
    public BookContext Context
    {
        get { return db; }
        set { db = value; }
    }
}

Установим значение для этого свойства:

builder.RegisterType<BookRepository>()
    .As<IRepository>()
    .WithProperty("Context", new BookContext());
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850