Pergunta

Tome o seguinte programa inútil:

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.Resolve<Program>();
    }
}

O UnityContainer vai me retornar uma instância de Programa, onde, como o recipiente Windsor irá lançar um ComponentNotFoundException.

Eu posso ver argumentos para ambos os comportamentos e não se importa que eu acabar com, no entanto Prism V2 Gota 8 (o mais tardar no momento da escrita) baseia-se no comportamento Unidade internamente, solicitando classes que não foram registrados.

Ao invés de encontrar e registar todas essas classes para Prism eu prefiro apenas fazer Windsor se comportam como Unidade. Eu não encontrei nada no google para me ajudar a fazer isso (embora minha terminologia pode estar errado) ea documentação Windsor é muito ruim ...

Alguém pode sugerir uma solução para este problema?

Foi útil?

Solução

Windsor atualmente não suporta isso, e é por design. O raciocínio é que você deve registrar explicitamente tipos que você precisa para que você não obter objeto mal configurado.

Há, porém, uma possibilidade que não será adicionado um gancho para criar tipo não-registrada em algum momento no futuro próximo, já que isso é necessário para a instalação de integração WCF. (Edit - ele foi adicionado em v2.1 - dê uma olhada ILazyComponentLoaders)

Enfim , independentemente de carregadores de componentes preguiçosos, o melhor que você pode fazer é usar API fluente para lote registrar todos os tipos a partir de um correspondentes montagem seus critérios necessários iniciais. Não é muito mais código e você vai dormir melhor à noite.

Use carregadores preguiçosos somente se você tiver informação realmente não o suficiente na inicialização (em sua composição raiz ) para determinar quais os componentes que você precisa.

Outras dicas

Windsor não suporta que fora da caixa, mas você pode criar métodos de extensão para fazer isso:

static class WindsorExtensions
{
    public static object ResolveType(this IWindsorContainer container, Type type)
    {
        if ( type.IsClass && !container.Kernel.HasComponent(type) )
            container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient);
        return container.Resolve(type);
     }

     public static T ResolveType<T>(this IWindsorContainer container)
     { return (T)ResolveType(container, typeof(T)); }
}

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.ResolveType<Program>();
    }
}

Krzysztof não tenha medo de link para o seu próprio blog aqui :) http://devlicious.com/blogs/krzysztof_kozmic/archive/2009/11/16/castle-windsor-lazy-loading.aspx

Além disso, achei que esta implementação simples útil no meu aplicativo WPF, remova o contraint corda e você está perto o caso geral

public class ViewModelLoader : Castle.MicroKernel.Resolvers.ILazyComponentLoader {
    public IRegistration Load(string key, Type service)
    {
        if (service == null)
            return null;
        if (service.Name.EndsWith("ViewModel", StringComparison.CurrentCultureIgnoreCase))
            return Component.For(service).Named(key);
        else
            return null;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top