Замок Виндзор жалуется, что ему не хватает зависимостей, потому что они не зарегистрированы - PullRequest
4 голосов
/ 05 июня 2011

Я использую Castle Windsor для регистрации своих служб и типов веб-приложений в Global.asax.Если я ставлю точку останова в конце метода, который их регистрирует, и смотрю на отладчик, я вижу это под зарегистрированными компонентами:

[0] "FuturaCodingExercise.XML.Impl.ValidateXmlImpl" IValidateXml / ValidateXmlImpl  
[1] "FuturaCodingExercise.XML.Impl.ProvideXmlDocumentImpl" IProvideXmlDocument / ProvideXmlDocumentImpl
[2] "FuturaCodingExercise.XML.Impl.ProvideXmlSchemasImpl" IProvideXmlSchemas / ProvideXmlSchemasImpl
[3] "FuturaCodingExercise.XML.Impl.ProvideXmlReaderImpl" IProvideXmlReader / ProvideXmlReaderImpl
[4] "FuturaCodingExercise.XML.Impl.ProvideValidationHandlingImpl" IProvideValidationHandling / ProvideValidationHandlingImpl
[5] "FuturaCodingExercise.Web.Impl.ProvideTheApplicationPathImpl" IProvideTheApplicationPath / ProvideTheApplicationPathImpl
[6] "FuturaCodingExercise.Web.Impl.ProvideCountriesImpl" IProvideCountries / ProvideCountriesImpl
[7] "FuturaCodingExercise.Web.Impl.ProvideTagsImpl" IProvideTags / ProvideTagsImpl
[8] "FuturaCodingExercise.Web.Xml.PostalAddressXmlProcessor" XmlProcessor`1 / PostalAddressXmlProcessor

У меня есть 9 различных типов, зарегистрированных в контейнере.Тем не менее, контейнер содержит список потенциально неправильно настроенных компонентов.PostalAddressXmlProcessor указан как неправильно настроенный по этой причине:

Some dependencies of this component could not be statically resolved.
FuturaCodingExercise.Web.Xml.PostalAddressXmlProcessor is waiting for the following dependencies: 

Services: 
- FuturaCodingExercise.Web.Interfaces.IProvideTheApplicationPath which was not registered. 
- FuturaCodingExercise.XML.Interfaces.IProvideXmlDocument which was not registered. 
- FuturaCodingExercise.XML.Interfaces.IValidateXml which was not registered. 
- FuturaCodingExercise.XML.Interfaces.IProvideValidationHandling which was not registered. 

Я не понимаю, как мне говорят, что эти интерфейсы не регистрируются, когда я вижу их в контейнере.

---EDIT

Это код, который регистрирует компоненты

private static void RegisterAssembly(IWindsorContainer windsorContainer, Assembly assembly)
{
     windsorContainer.Register(AllTypes
                .FromAssembly(assembly)
                .Where(x => x.Name.EndsWith("Impl"))
                .WithService.DefaultInterface()
                .Configure(c => c.LifeStyle.Singleton));
}

private static void RegisterAssembly(IWindsorContainer windsorContainer, string name)
{
     var path = string.Format(@"{0}Bin\{1}.dll", HttpContext.Current.Server.MapPath("~"), name);
     RegisterAssembly(windsorContainer, Assembly.LoadFile(path)); 
}

protected void Application_OnStart()
{
    RegisterRoutes(RoutingModuleEx.Engine);

    _container = new WebApplicationContainer();

    var assembliesToRegister = WindsorConfig.GetConfig().Assemblies;
    foreach (AssemblyElement assembly in assembliesToRegister)
    {
        RegisterAssembly(_container, assembly.Name);
    }

    // Register extra

    _container.Register(
        Component.For(typeof(XmlProcessor<PostalAddress>))
        .ImplementedBy(typeof(PostalAddressXmlProcessor))
        .LifeStyle.Singleton);

    _container.Register(
        Component.For(typeof(XmlProcessor<WebAddress>))
        .ImplementedBy(typeof(WebAddressXmlProcessor))
        .LifeStyle.Singleton);

    _container.Initialise();
}

И метод Initialize для контейнера

public void Initialise()
{
    AddFacility("rails", new MonoRailFacility());

    Register(AllTypes
    .FromAssembly(Assembly.GetAssembly(typeof(HomeController)))
    .BasedOn<IController>());

    Register(AllTypes
    .FromAssembly(Assembly.GetAssembly(typeof(HomeController)))
    .BasedOn<ViewComponent>()
    .Configure(c => c.Named(c.ServiceType.Name)
    .LifeStyle.Is(LifestyleType.Transient)));
}

Система имеет только один контроллер с оченьпока немного кода ...

public class HomeController : SmartDispatcherController
{
    private XmlProcessor<PostalAddress> postalAddressXmlProcessor;
    private XmlProcessor<WebAddress> webAddressXmlProcessor;

    public HomeController(XmlProcessor<PostalAddress> postalAddressXmlProcessor, XmlProcessor<WebAddress> webAddressXmlProcessor)
    {
        this.postalAddressXmlProcessor = postalAddressXmlProcessor;
        this.webAddressXmlProcessor = webAddressXmlProcessor;
    }

    [Layout("default")]
    public void Index()
    {
        var rootPath = HttpContext.Server.MapPath("~");
        PropertyBag["RootPath"] = rootPath;
    }
}
...