当前位置:  开发笔记 > 运维 > 正文

使用Castle Windsor解析类而不注册它们

如何解决《使用CastleWindsor解析类而不注册它们》经验,为你挑选了2个好方法。

采取以下无用的计划:

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

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

UnityContainer将返回一个Program实例,其中Windsor容器将抛出ComponentNotFoundException.

我可以看到这两种行为的争论,并且不介意我最终会遇到什么,但是Prism V2 Drop 8(写作时最新的)依赖于内部的Unity行为,请求尚未注册的类.

而不是为Prism找到并注册所有这些类,我宁愿让Windsor表现得像Unity一样.我没有在谷歌找到任何帮助我这样做的东西(虽然我的术语可能是错的)和Windsor文档相当糟糕...

任何人都可以建议解决这个问题吗?



1> Krzysztof Ko..:

温莎目前不支持这一点,而且它是设计的.原因是你应该显式注册你需要的类型,这样你就不会得到配置错误的对象.

然而,有可能在不久的将来会在某个时刻添加一个钩子来创建非注册类型,因为这是WCF集成工具所需要的.(编辑 - 它在v2.1中添加 - 看看ILazyComponentLoaders)

无论如何,无论惰性组件加载器如何,您可以做的最好的事情是使用流畅的API批量注册所有类型,从预先匹配您所需条件的程序集.这不是更多的代码,你晚上睡得更好.

只有在启动时(在组合根目录中)确实没有足够的信息来确定您需要哪些组件时,才使用延迟加载器.


@urig - 这样你就可以说只获取web.config中指定的类型,而不是将注册复制到容器中.干.

2> Bojan Resnik..:

Windsor不支持开箱即用,但您可以创建扩展方法来执行此操作:

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(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 castleProgram = windsorContainer.ResolveType();
    }
}

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有