Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
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 определим в проекте, например, в какой-нибудь дополнительной папке 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());