2016-01-06 4 views
2

Я новичок в Autofac. Я пытаюсь интегрировать autofac с приложением asp.net mvc с полным решением после шаблона репозиторияAutofac Lifetime Scope с ASP.NET MVC

Ниже приведена конфигурация, которую я сделал.

MvcProject.Website.Global.asax.cs

..Application_start() { 
    App_Start.AutofacConfig.ConfigureContainer(); 
} 

MvcProject.Website.App_Start.AutofacConfig.cs

ПРИМЕЧАНИЕ: Я зарегистрировал RegisterTypes в качестве модулей в различные проекты и привязать их к следующему основному файлу конфигурации.

public static class AutofacConfig 
    { 
     public static void ConfigureContainer() 
     { 
      var builder = new ContainerBuilder(); 
    builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired(); 

      //Register Repository dependencies 
      builder.RegisterModule(new RepositoryModule("mssql")); 

      //Register Application dependencies 
      builder.RegisterModule(new ApplicationModule()); 

      var container = builder.Build(); 
      DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     } 
    } 

Затем в слое приложений, регистрация Тип сделано путем расширения модуля абстрактного класса

MvcProject.Application.ApplicationModule.cs

public class ApplicationModule : Module 
{ 
    protected override void Load(Containerbuilder builder) 
    { 
     builder.RegisterType<MyService>.InstancePerLifetimeScope(); 
     base.Load(builder); 
    } 
} 

Затем из контроллера

MvcProject.Website.Controllers.MyController.cs

public class MyController : Controller 
    { 
     private ILifetimeScope _scope; 

     public MyController(ILifetimeScope scope) 
     { 
      _scope = scope; 
     } 

     public ActionResult SayHello() 
     { 
      using (var localscope = _scope.BeginLifetimeScope()) 
      { 
       var service = localscope.Resolve<MyService>(); 
       var viewModel = service.GetMyViewModel(); 
       return View(viewModel); 
      } 
     } 
    } 

Мои основные вопросы:

  1. , чтобы избежать проблем утечки памяти, мы должны определить прижизненные областей (как в приведенном выше SayHello MyController в действие) в контроллерах MVC или это НЕ необходимо для MVC?
  2. Передача Типового регистра на отдельные проекты с использованием модуля является правильным способом или есть лучший/правильный способ?
  3. Есть ли лучший способ получить ILifetimeScope внутри MyController, не передавая параметр «ILifetimeScope» из конструктора контроллера?

Благодарим вас заранее.

ответ

2

Я предполагаю, что вы уже проверили документы Autofac для некоторых примеров и объяснение вещей, как how to integrate with MVC и how lifetime scopes work, так что я буду краток:

  • Не создавать свою собственную жизнь областей в контроллерах, если вам это не нужно. Каждый запрос уже получает свою собственную продолжительность жизни - все, что вы разрешаете, охвачено запросом или на основе каждого экземпляра, будет предоставлено вам в конце запроса.
  • Как вы регистрируете свои типы и организуете их, очень субъективно, исходя из того, как структурировано ваше приложение. Модули для каждого проекта - это один из способов (хороший способ) сделать это.
  • Как правило, избегайте проезда ILifetimeScope в ваших контроллерах. Просто возьмите свои зависимости в конструкторе для контроллера, как и любой другой сценарий инжекции управления/зависимости. Если вы хотите отложить решение службы (например, вам может и не понадобиться), то look at things like the Func<T> relationship that Autofac supports.
+0

Благодарим за подробный ответ. – scFootsteps

+0

Спасибо за подробный ответ. Я прочитал следующую статью, и было принято решение использовать lifetimecope, чтобы избежать утечек памяти. http://nblumhardt.com/2011/01/an-autofac-lifetime-primer/. Итак, я думаю, что это не применимо к веб-запросам? – scFootsteps

+0

Вы хотите использовать шкалы времени жизни. Он применим к MVC. Просто с интеграцией Autofac, это позаботится о вас. –

Смежные вопросы