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

Jam*_*ley 17 .net castle-windsor prism unity-container

采取以下无用的计划:

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Krz*_*mic 9

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

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

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

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

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

Boj*_*nik 6

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<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>();
    }
}
Run Code Online (Sandbox Code Playgroud)