Внешние контроллеры и замок - PullRequest
0 голосов
/ 22 июля 2009

ИСПРАВЛЕНО: Я оставляю это на тот случай, если это понадобится другим Джо Шмо.

На фабрике контроллеров необходимо зарегистрировать контроллер, чтобы его можно было найти при вызове. container.Kernel.AddComponent ("ExternalResources", typeof (InteSoft.Web.ExternalResourceLoader.ExternalResourceController), LifestyleType.Transient); Сделайте так:

// Instantiate a container, taking configuration from web.config
        container = new WindsorContainer(
        new XmlInterpreter(new ConfigResource("castle"))
        );
        // Also register all the controller types as transient
        var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                              where typeof(IController).IsAssignableFrom(t)
                              select t;

        foreach (Type t in controllerTypes)
            container.AddComponentWithLifestyle(t.FullName, t,
            LifestyleType.Transient);

        // Register controllers in external assemblies
        container.Kernel.AddComponent("ExternalResources", typeof(InteSoft.Web.ExternalResourceLoader.ExternalResourceController), LifestyleType.Transient);

Я использую загрузчик ресурсов MVC для сжатия и минимизации моих CSS и JS. Я также использую WindsorControllerFactory для внедрения зависимости. Загрузчик MVC REsource использует контроллер, который находится в пространстве имен InteSoft.Web.ExternalResourceLoader, которое находится в отдельной сборке.

Проблема заключается в том, что Касл не может найти (и разрешить) этот контроллер, потому что он находится в другой сборке. Я довольно новичок в DI и Касле, поэтому я не знаю, с чего начать.

Файл конфигурации замка

<component id="MVCResourceLoader"
             service="System.Web.Mvc.ITempDataProvider, System.Web.Mvc"
             type="InteSoft.Web.ExternalResourceLoader.NullTempDataProvider, InteSoft.Web.ExternalResourceLoader"
             lifestyle="PerWebRequest">           
</component>

Windsor Controller Factory

public class WindsorControllerFactory : DefaultControllerFactory
{
    WindsorContainer container;
    // The constructor:
    // 1. Sets up a new IoC container
    // 2. Registers all components specified in web.config
    // 3. Registers all controller types as components
    public WindsorControllerFactory()
    {
        // Instantiate a container, taking configuration from web.config
        container = new WindsorContainer(
        new XmlInterpreter(new ConfigResource("castle"))
        );
        // Also register all the controller types as transient
        var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                              where typeof(IController).IsAssignableFrom(t)
                              select t;

        foreach (Type t in controllerTypes)
            container.AddComponentWithLifestyle(t.FullName, t,
            LifestyleType.Transient);

    }
    // Constructs the controller instance needed to service each request
    protected override IController GetControllerInstance(Type controllerType)
    {
        return (IController)container.Resolve(controllerType);
    }
}

Страница ошибки

    Server Error in '/' Application.
The type name InteSoft.Web.ExternalResourceLoader.NullTempDataProvider, InteSoft.Web.ExternalResourceLoader could not be located
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Configuration.ConfigurationErrorsException: The type name InteSoft.Web.ExternalResourceLoader.NullTempDataProvider, InteSoft.Web.ExternalResourceLoader could not be located

Source Error:

Line 23:         {
Line 24:             // Instantiate a container, taking configuration from web.config
Line 25:             container = new WindsorContainer(
Line 26:             new XmlInterpreter(new ConfigResource("castle"))
Line 27:             );


Source File: C:\Projects\CaseLogger Pro\CaseLogger.Website\WindsorControllerFactory.cs    Line: 25

Stack Trace:

[ConfigurationErrorsException: The type name InteSoft.Web.ExternalResourceLoader.NullTempDataProvider, InteSoft.Web.ExternalResourceLoader could not be located]
   Castle.Windsor.Installer.DefaultComponentInstaller.ObtainType(String typeName) +81
   Castle.Windsor.Installer.DefaultComponentInstaller.SetUpComponents(IConfiguration[] configurations, IWindsorContainer container) +132
   Castle.Windsor.Installer.DefaultComponentInstaller.SetUp(IWindsorContainer container, IConfigurationStore store) +66
   Castle.Windsor.WindsorContainer.RunInstaller() +35
   Castle.Windsor.WindsorContainer..ctor(IConfigurationInterpreter interpreter) +60
   CaseLogger.Website.WindsorControllerFactory..ctor() in C:\Projects\CaseLogger Pro\CaseLogger.Website\WindsorControllerFactory.cs:25
   CaseLogger.MvcApplication.Application_Start() in C:\Projects\CaseLogger Pro\CaseLogger.Website\Global.asax.cs:50


Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082 

Пожалуйста, дайте мне знать, если мне нужно предоставить больше отладочной информации.

UPDATE Если я обращаюсь к URL напрямую, он возвращает сжатые файлы, например, http://localhost:3826/Shared/ExternalResource?name=MinScript&version=20080811&display=Show

Ответы [ 3 ]

0 голосов
/ 01 декабря 2009

Не думаю, что вы сможете получать услуги во внешних сборках, позвонив по номеру Assembly.GetExecutingAssembly().GetTypes().

Попробуйте использовать Assembly.LoadFrom("Assembly_Name"), а затем зарегистрируйте компонент с "ExternalResources".

0 голосов
/ 01 декабря 2009

Кстати, вот мой ControllerFactory, использующий Castle:

Почему Castle Windsor пытается разрешить мои папки «Содержимое» и «Скрипты» в качестве контроллера?

Обратите внимание, что я использую Assembly.GetCallingAssembly (). GetTypes (), так как мой пользовательский ControllerFactory находится в отдельной сборке. Если вы помещаете его в основной проект mvc, измените его на GetExecutingAssembly ().

0 голосов
/ 23 июля 2009

Скорее всего, сборка, в которой живет NullTempDataProvider, является InteSoft.Web, а не InteSoft.Web.ExternalResourceLoader. Если это так, то регистрация должна быть:

<component id="MVCResourceLoader"
             service="System.Web.Mvc.ITempDataProvider, System.Web.Mvc"
             type="InteSoft.Web.ExternalResourceLoader.NullTempDataProvider, InteSoft.Web"
             lifestyle="PerWebRequest">           
</component>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...