Autofac + MVC3 + Html.Action - PullRequest
       18

Autofac + MVC3 + Html.Action

1 голос
/ 28 февраля 2012

У меня та же проблема, что и в этот вопрос

Сообщение об ошибке: Один экземпляр контроллера Search.Web.Controllers.AdvancedController нельзя использовать для обработки нескольких запросов. Если используется фабрика пользовательских контроллеров, убедитесь, что она создает новый экземпляр контроллера для каждого запроса.

Код в Global.asax:

protected void Application_Start()
{
  var containerBuilder = new ContainerBuilder();

  containerBuilder.RegisterType<AdvancedController>().InstancePerHttpRequest();
  containerBuilder.RegisterType<MemoryBodyTypeRepository>().As<IBodyTypeRepository>;
  containerBuilder.RegisterType<BodyTypePictureClassFinder>().As<IBodyTypePictureClassFinder>();

  var container = containerBuilder.Build();

  DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
  AreaRegistration.RegisterAllAreas();

  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
}

Это некоторый код из AdvancedController:

private readonly IBodyTypeRepository _bodyTypeRepository;
private readonly IBodyTypePictureClassFinder _bodyTypePictureClassFinder;

public AdvancedController(IBodyTypeRepository bodyTypeRepository, IBodyTypePictureClassFinder bodyTypePictureClassFinder)
{
    _bodyTypeRepository = bodyTypeRepository;
    _bodyTypePictureClassFinder = bodyTypePictureClassFinder;
}

[HttpGet]
public ActionResult Index()
{
    var advancedSearchViewModel = new AdvancedSearchViewModel();        

    return View(advancedSearchViewModel);
}

public ActionResult BodyTypes()
{
    // this uses the repositories to create the ViewModel

    return View(bodyTypesViewModel);
}

И индексное представление:

<div>
    @Html.Action("BodyTypes","Advanced")   
</div>

Если я выполню этот Просмотр, я получу сообщение, указанное выше. Я также попытался удалить InstancePerHttpRequest или использовать RegisterControllers вместо явного их повторного добавления, но это тоже не сработало. Если я использую RegisterControllers, я получаю ту же ошибку. Если я удалю InstancePerHttpRequest, он каким-то образом выполнит весь просмотр дважды, что тоже не то, что я хотел бы сделать;)

Я надеюсь, что кто-нибудь может помочь. Это настоящий Showstopper для меня.

Большое спасибо !!!!

С уважением, Флориан Фандерл

1 Ответ

0 голосов
/ 29 ноября 2012

Я знаю, что это было опубликовано давно. У меня была такая же проблема, я мог решить мою проблему с вашим вопросом. Надеюсь, что это будет полезно для кого-то в использовании.

var builder = new ContainerBuilder();

            builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>().InstancePerHttpRequest();
            builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker().InstancePerHttpRequest();
            builder.RegisterType<ConfigService>().As<IConfigService>().InstancePerLifetimeScope();
            builder.RegisterType<EntryService>().As<IEntryService>().InstancePerLifetimeScope();
            builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
            builder.RegisterType<MessageService>().As<IMessageService>().InstancePerLifetimeScope();
            builder.RegisterType<CloudService>().As<ICloudService>().InstancePerLifetimeScope();
            builder.RegisterType<Services>().As<IServices>().InstancePerLifetimeScope();

            builder.RegisterType<AccountController>().InstancePerDependency();


            _containerProvider = new ContainerProvider(builder.Build());

            ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory(ContainerProvider));

            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
            AuthConfig.RegisterAuth();

            HtmlHelper.ClientValidationEnabled = true;
            HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

            // Quartz.NET scheduler
            ISchedulerFactory factory = new StdSchedulerFactory();
            var scheduler = factory.GetScheduler();
            scheduler.JobFactory = new AutofacJobFactory(ContainerProvider);
            scheduler.Start();
        }

если вы заметили, что это мой someController

builder.RegisterType<AccountController>().InstancePerDependency();
...