采取以下无用的计划:
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文档相当糟糕...
任何人都可以建议解决这个问题吗?
温莎目前不支持这一点,而且它是设计的.原因是你应该显式注册你需要的类型,这样你就不会得到配置错误的对象.
然而,有可能在不久的将来会在某个时刻添加一个钩子来创建非注册类型,因为这是WCF集成工具所需要的.(编辑 - 它在v2.1中添加 - 看看ILazyComponentLoader
s)
无论如何,无论惰性组件加载器如何,您可以做的最好的事情是使用流畅的API批量注册所有类型,从预先匹配您所需条件的程序集.这不是更多的代码,你晚上睡得更好.
只有在启动时(在组合根目录中)确实没有足够的信息来确定您需要哪些组件时,才使用延迟加载器.
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 (); } }