解决类不使用温莎城堡注册它们
-
22-07-2019 - |
题
以下面的无用的程序:
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>();
}
}
在UnityContainer将返回我方案,其中作为容器温莎将抛出ComponentNotFoundException的一个实例。
我可以看到两者的行为参数和不介意,我结束了,但是棱镜V2下降8(最迟在写作的时间)内依靠团结的行为,请求尚未注册类。
而不是寻找和登记所有这些类棱镜我宁愿只是让温莎表现得像统一。我还没有找到任何谷歌帮我做到这一点(虽然我的术语可能是错误的)和温莎文档是相当糟糕...
任何人都可以提出一个解决这个问题?
解决方案
目前温莎不支持,它的设计。其理由是,你应该明确地注册,你需要这样的类型,你没得到错误配置的对象。
然而,有一种可能性,即有将被添加一个钩在不久的将来的某个点以创建非注册类型,这是由WCF集成设施需要的。 (编辑 - 它是在2.1中加入 - 看一看ILazyComponentLoader
s)
<强>反正下,无论懒惰部件装载机的,可以执行最佳的是使用流利API批量从符合所需标准的前期的组件注册的所有类型。它没有更多的代码,你会在晚上睡得更好。
使用懒装载机只有当你在启动时有真的没有足够的信息(在组成根的)来确定你需要哪些组件。
其他提示
温莎不支持开箱即用,但您可以创建扩展方法来做到这一点:
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>();
}
}
克日什托夫·不要害怕在这里链接到自己的博客:)的 http://devlicious.com/blogs/krzysztof_kozmic/archive/2009/11/16/castle-windsor-lazy-loading.aspx
另外,我发现这个简单的实现有用的在我的WPF应用程序,去除串contraint和你接近一般情况下
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;
}
}
不隶属于 StackOverflow