StructureMap не разрешает экземпляры контроллера в приложении MVC3 - PullRequest
1 голос
/ 29 марта 2012

Я нахожусь в процессе интеграции StructureMap в мое приложение MVC3. Я сталкиваюсь с проблемой, когда мой пользовательский ControllerFactory выдает исключение при попытке создать контроллер:

Код исключения StructureMap: 200 Не удалось найти экземпляр с именем "contentpage" для PluginType System.Web.Mvc.IController

Вот что у меня в контейнере:

Контроллер (System.Web.Mvc.Controller)
Определено как: переходный процесс

AuctionCMS.Web.Controllers.HomeController, AuctionCMS.Web, Версия = 1.0.0.0, Культура = нейтральная,

AuctionCMS.Web.Controllers.ContentPageController, AuctionCMS.Web, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null Сконфигурировано Экземпляр AuctionCMS.Web.Controllers.ContentPageController, AuctionCMS.Web, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль

Я заметил, что фабрика контроллеров запрашивает «contentpage» вместо «contentpagecontroller». Это правильное поведение? Что не так?

Вот мой код:

    private void InitStructureMap()
    {
        var container = new StructureMap.Container();

        DependencyResolver.SetResolver(new StructureMapContainer(container));
        ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory(container));

        PerformRuntimeDepdendencyConfiguration(container);
    }



    private void PerformRuntimeDepdendencyConfiguration(IContainer container)
    {
        container.Configure(x => x.Scan(y =>
        {
            y.TheCallingAssembly();
            y.WithDefaultConventions();
            y.LookForRegistries();
            y.AddAllTypesOf<Controller>();
        }));
    }



public class StructureMapContainer : IDependencyResolver
{
    static IContainer _container;

    public StructureMapContainer(IContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        if (serviceType.IsAbstract || serviceType.IsInterface)
        {
            return _container.TryGetInstance(serviceType);
        }
        else
        {
            return _container.GetInstance(serviceType);
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances<object>().Where(s => s.GetType() == serviceType);
    }
}


    public class StructureMapControllerFactory : IControllerFactory
    {
        private readonly IContainer _container;

        public StructureMapControllerFactory(IContainer container)
        {
            _container = container;
        }

        public IController CreateController(RequestContext requestContext, string controllerName)
        {
            System.Diagnostics.Debug.WriteLine(_container.WhatDoIHave()); 

            return _container.GetInstance<IController>(controllerName.ToLowerInvariant());
        }

        public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
        {
            return SessionStateBehavior.Default;
        }

        public void ReleaseController(IController controller)
        {
            return;
        }
    }

public class ApplicationRegistry : Registry
{
    public ApplicationRegistry()
    {
        ... register some types ...
    }
}

1 Ответ

1 голос
/ 30 марта 2012

Как вы отметили в комментариях, ваши контроллеры не зарегистрированы по имени. Попробуйте это:

container.Configure(x => x.Scan(y =>
{
    y.TheCallingAssembly();
    y.WithDefaultConventions();
    y.LookForRegistries();
    y.AddAllTypesOf<Controller>()
         .NameBy(type => type.Name.Replace("Controller", "")
         .ToLowerInvariant());
}));
...